我想控制玩家和能量提升之间的触发器。我可以创建一个GameObject并附加脚本来控制所有触发事件,而不是为每个脚本创建一个脚本吗?
喜欢
void OnTriggerEnter2D(Collider2D collision){
switch(collision.gameObject.tag){
case "Move+":
FindObjectOfType<CreatePlayer>().movesRemain += 5;
break;
}
}
但是当这样做时,玩家必须触发包含脚本的GameObject。
我可以创建一个GameObject并附加脚本来控制所有触发事件,而不是为每个脚本创建一个脚本吗?
要调用OnTriggerEnter2D
,必须将包含它的脚本附加到将参与碰撞的GameObject。如果不这样做,则不会调用它。
如果需要通用脚本来处理所有冲突检测,则必须使用事件和委托来执行此操作。创建一个名为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
脚本中调用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);
}
}