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

问题描述 投票:1回答:1

我想控制玩家和能量提升之间的触发器。我可以创建一个GameObject并附加脚本来控制所有触发事件,而不是为每个脚本创建一个脚本吗?

喜欢

void OnTriggerEnter2D(Collider2D collision){
    switch(collision.gameObject.tag){
        case "Move+":
            FindObjectOfType<CreatePlayer>().movesRemain += 5;
            break;
    }
}

但是当这样做时,玩家必须触发包含脚本的GameObject。

c# unity3d
1个回答
0
投票

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

要调用OnTriggerEnter2D,必须将包含它的脚本附加到将参与碰撞的GameObject。如果不这样做,则不会调用它。


如果需要通用脚本来处理所有冲突检测,则必须使用事件和委托来执行此操作。创建一个名为delegateCollisionAction,然后创建一个名为delegateOnTriggered事件。调用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脚本中调用CollisionCallback时,将调用MainScript中的注册函数。附加到空的GameObject:

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.