猿问

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

我想控制玩家和道具之间的触发器。我可以创建一个游戏对象并附加一个脚本来控制所有触发事件,而不是为每个对象创建一个脚本吗?


喜欢


void OnTriggerEnter2D(Collider2D collision){

    switch(collision.gameObject.tag){

        case "Move+":

            FindObjectOfType<CreatePlayer>().movesRemain += 5;

            break;

    }

}

但这样做时,玩家必须触发包含脚本的游戏对象。


LEATH
浏览 139回答 1
1回答

红颜莎娜

我可以创建一个游戏对象并附加一个脚本来控制所有触发事件,而不是为每个对象创建一个脚本吗?为了OnTriggerEnter2D被调用,包含它的脚本必须附加到将涉及碰撞的游戏对象。如果不这样做,它将不会被调用。如果您需要一个通用脚本来处理所有碰撞检测,则必须使用事件和委托来执行此操作。创建一个delegate命名CollisionAction然后从该delegate命名的事件OnTriggered。当OnTriggerEnter2D被调用时,调用该OnTriggered事件。将它附加到您想要检测碰撞的所有游戏对象上。public class CollisionCallback : MonoBehaviour{&nbsp; &nbsp; public delegate void CollisionAction(Collider2D collision);&nbsp; &nbsp; public static event CollisionAction OnTriggered;&nbsp; &nbsp; void OnTriggerEnter2D(Collider2D collision)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (OnTriggered != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnTriggered(collision);&nbsp; &nbsp; }}现在,在要用于处理碰撞的主脚本上,在函数中注册OnTriggered事件并在OnEnable函数中取消注册OnDisable。在脚本OnTriggerEnter2D中调用时,将调用 中注册CollisionCallbackMainScript的函数。附加到一个空的游戏对象:public class MainScript : MonoBehaviour{&nbsp; &nbsp; void OnEnable()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //Register to OnTriggered event&nbsp; &nbsp; &nbsp; &nbsp; CollisionCallback.OnTriggered += TriggerDetected;&nbsp; &nbsp; }&nbsp; &nbsp; void OnDisable()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //Un-Register to OnTriggered event&nbsp; &nbsp; &nbsp; &nbsp; CollisionCallback.OnTriggered -= TriggerDetected;&nbsp; &nbsp; }&nbsp; &nbsp; //This is invoked when trigger happens&nbsp; &nbsp; void TriggerDetected(Collider2D collision)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Debug.Log("Trigger happened with: " + collision.name);&nbsp; &nbsp; }}
随时随地看视频慕课网APP
我要回答