统一脚本对象事件传递参数

时间:2018-09-25 08:17:15

标签: unity3d events

不能将参数传递给侦听器

[System.Serializable]
     public class EventGameObject : UnityEvent<GameObject> { }

[CreateAssetMenu]
     public class GameObjectEvent : ScriptableObject
     {
         private readonly List<GameObjectEventListener> eventListeners =
             new List<GameObjectEventListener>();

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

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

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

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

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

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

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

     public void OnEventRaised(GameObject go)
     {
         Response.Invoke(go);
     }
 }
 >>>>gameObject X<<<<
 public class AIController : MonoBehaviour
 {
     public EventGameObject OnAIDeath;
     private void Start()
     {
     OnAIDeath.Invoke(gameObject);
     }
 }

 >>>>gameObject Y<<<<
 public class SceneMapController : MonoBehaviour
 {
     public void OnAIDeath(GameObject entityGO)
     {
         Debug.Log(entityGO);
     }
 }

GameObjectEventListener在SceneManager游戏对象上,当我将Scriptableobject事件拖到事件插槽上时,我想用作监听器SceneMapController脚本,并使用AIController中的gameobject参数运行方法OnAiDeath(这是另一个游戏对象上的脚本)invoke(gameObject )(查看图片)

简短说明:当gameObject X与AIController脚本一起死亡时,我想将gameObject(已死亡)从gameObject Y传递给侦听器,并使用脚本函数中收到的gameObject。

我在做什么错?我得到此错误,请帮助。Unsupported type EventGameObject https://imgur.com/a/ZhIqiWG大多数代码都来自这里:https://www.youtube.com/watch?v=raQ3iHhE_Kk&t=2325s

1 个答案:

答案 0 :(得分:0)

您是否要挂钩编辑器中的事件?如果是这样,请注意接收器下拉菜单。

difference between dynamic and static event binding

您会看到会有“动态布尔”和“静态参数”,它们的接收器方法都具有相同的名称。如果选择最下面的一个,则参数将在运行时从代码中传递,但是如果选择最下面的一个,则该参数将始终是您在此处指定的参数: a static event binding with specified parameter