为了账号安全,请及时绑定邮箱和手机立即绑定

检测/处理来自一个脚本或未附加到碰撞游戏对象的脚本的所有碰撞

检测/处理来自一个脚本或未附加到碰撞游戏对象的脚本的所有碰撞

C#
LEATH 2022-01-16 14:33:49
我想控制玩家和道具之间的触发器。我可以创建一个游戏对象并附加一个脚本来控制所有触发事件,而不是为每个对象创建一个脚本吗?喜欢void OnTriggerEnter2D(Collider2D collision){    switch(collision.gameObject.tag){        case "Move+":            FindObjectOfType<CreatePlayer>().movesRemain += 5;            break;    }}但这样做时,玩家必须触发包含脚本的游戏对象。
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我可以创建一个游戏对象并附加一个脚本来控制所有触发事件,而不是为每个对象创建一个脚本吗?


为了OnTriggerEnter2D被调用,包含它的脚本必须附加到将涉及碰撞的游戏对象。如果不这样做,它将不会被调用。


如果您需要一个通用脚本来处理所有碰撞检测,则必须使用事件和委托来执行此操作。创建一个delegate命名CollisionAction然后从该delegate命名的事件OnTriggered。当OnTriggerEnter2D被调用时,调用该OnTriggered事件。将它附加到您想要检测碰撞的所有游戏对象上。


public class CollisionCallback : MonoBehaviour

{

    public delegate void CollisionAction(Collider2D collision);

    public static event CollisionAction OnTriggered;


    void OnTriggerEnter2D(Collider2D collision)

    {

        if (OnTriggered != null)

            OnTriggered(collision);

    }

}

现在,在要用于处理碰撞的主脚本上,在函数中注册OnTriggered事件并在OnEnable函数中取消注册OnDisable。在脚本OnTriggerEnter2D中调用时,将调用 中注册CollisionCallbackMainScript的函数。附加到一个空的游戏对象:


public class MainScript : MonoBehaviour

{

    void OnEnable()

    {

        //Register to OnTriggered event

        CollisionCallback.OnTriggered += TriggerDetected;

    }



    void OnDisable()

    {

        //Un-Register to OnTriggered event

        CollisionCallback.OnTriggered -= TriggerDetected;

    }



    //This is invoked when trigger happens

    void TriggerDetected(Collider2D collision)

    {

        Debug.Log("Trigger happened with: " + collision.name);

    }

}


查看完整回答
反对 回复 2022-01-16
  • 1 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信