我的解决方案如下:
首先我将以下脚本添加到我的项目中
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// Delegates the call to OnTrigger2D for this object to another object.
/// </summary>
public class OnTrigger2DDelegator : MonoBehaviour
{
private Collider2D caller;
private void Awake()
{
caller = GetComponent<Collider2D>();
}
[Tooltip("Which function should be called when trigger was entered.")]
public UnityEvent<OnTriggerDelegation> Enter;
[Tooltip("Which function should be called when trigger was exited.")]
public UnityEvent<OnTriggerDelegation> Exit;
void OnTriggerEnter2D(Collider2D other) => Enter.Invoke(new OnTriggerDelegation(caller, other));
void OnTriggerExit2D(Collider2D other) => Exit.Invoke(new OnTriggerDelegation(caller, other));
}
/// <summary>
/// Stores which collider triggered this call and which collider belongs to the other object.
/// </summary>
public struct OnTriggerDelegation {
/// <summary>
/// Creates an OnTriggerDelegation struct.
/// Stores which collider triggered this call and which collider belongs to the other object.
/// </summary>
/// <param name="caller">The trigger collider which triggered the call.</param>
/// <param name="other">The collider which belongs to the other object.</param>
public OnTriggerDelegation(Collider2D caller, Collider2D other)
{
Caller = caller;
Other = other;
}
/// <summary>
/// The trigger collider which triggered the call.
/// </summary>
public Collider2D Caller { get; private set; }
/// <summary>
/// The other collider.
/// </summary>
public Collider2D Other { get; private set; }
}
大部分解释已经在我写的摘要中,但这里有一些更详细的说明。
将此脚本添加到例如Feet 对象(请记住,有一个代表我的玩家脚的触发器的 BoxCollider2D),将向检查器添加一些字段。然后,您可以拖入您的 Player 对象,并选择应该在 Player 对象上运行的函数。
如果我们现在将以下代码添加到我们的Player.cs,我们可以处理Player.cs 中的触发事件,同时可以访问 entered 或 exited 和incoming 或 outgoing 碰撞体。
public void OnFeetTriggerEnter(OnTriggerDelegation delegation)
{
// will print out "Feet" in my example
Debug.Log(delegation.Caller.name);
// will print out "Ground" in my example if the feet trigger was entered by an object called Ground.
Debug.Log(delegation.Other.name);
}
在检查器的 OnTrigger2DDelegator 部分中选择此方法会产生如下所示的内容:
瞧!您现在可以在 Player.cs 中添加另一个函数,例如 OnBodyTriggerEnter,将另一个委托器添加到 body 对象并在检查器中选择该函数。
这让您可以在同一个文件中设置所有触发事件。
注意:如果您不需要访问 entered 或 exited 碰撞器,但确实希望能够区分对不同触发器的调用,则可以使用我在这里展示的相同设置,但跳过结构。只需将UnityEvent<OnTriggerDelegation> 替换为UnityEvent<Collider(2D)> 并将other 传递给Enter.Invoke()。然后你的Player.cs 处理函数可能看起来像public void OnFeetTriggerEnter(Collision(2D) other)