如何将UnityEvent发送到GameObject的特定实例?

时间:2019-02-08 06:21:07

标签: unity3d

我有一个预制的房间。我有一个统一事件,当玩家进入时会触发该事件,我有一个事件监听器,该事件监听器会在事件引发时更改房间的状态。它还会更改任何预制件副本的状态,而不是触发事件的房间的状态。 如何将事件的范围缩小到仅触发该事件的游戏对象的实例?

private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
                RoomEnter.Raise();           
        }

public class GameEventListener : MonoBehaviour
    {
        [Tooltip("Event to register with.")]
        public GameEvent Event;

        [Tooltip("Response to invoke when Event is raised.")]
        public UnityEvent Response;

        private void OnEnable()
        {
            Event.RegisterListener(this);
        }

        private void OnDisable()
        {
            Event.UnregisterListener(this);
        }

        public void OnEventRaised()
        {
            Response.Invoke();
        }
    }

public class GameEvent : ScriptableObject
    {
        /// The list of listeners that this event will notify if it is raised.
        private readonly List<GameEventListener> eventListeners = 
            new List<GameEventListener>();

        public void Raise()
        {
            for(int i = eventListeners.Count -1; i >= 0; i--)
                eventListeners[i].OnEventRaised();
        }

        public void RegisterListener(GameEventListener listener)
        {
            if (!eventListeners.Contains(listener))
                eventListeners.Add(listener);
        }

        public void UnregisterListener(GameEventListener listener)
        {
            if (eventListeners.Contains(listener))
                eventListeners.Remove(listener);
        }
    }

1 个答案:

答案 0 :(得分:1)

为什么要使用事件?当玩家进入时,只需调用此房间的方法即可。

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Player"))
    {
        GetComponent<GameEventListener>().OnEventRaised();
    }
}