从一个脚本订阅对象到另一个脚本的事件

时间:2016-01-05 13:41:36

标签: c# unity3d

我有两个对象:CharacterController(或任何后代)和VisualController(或任何后代)。 CC有一组定义的事件(即死亡/受到伤害),VC可以订阅并以某种方式作出反应(播放动画)。如果脚本名称是任意的(因为它可能不是CC,而是它的后代),我可以用什么方式订阅VC到CC?所以我不能按名称获取游戏对象组件?

1 个答案:

答案 0 :(得分:0)

如果您的活动是UnityEvent,那么您只需拖放检查器中的插槽即可。

如果您使用.NET事件,它就像任何方法一样工作,您需要获取持有脚本的对象,然后您才能接受公共事件。

public class EventHolder:MonoBehaviour{
    public EventHandler<EventArg> RaiseEvent;
    protected void OnRaiseEvent(EventArg args){
         if(RaiseEvent != null){
              RaiseEvent(this, arg);
         }
    }
    void Update(){
        if(condition) { OnRaiseEvent(this, new EventArg()); }
    }
}

public class EventListener:MonoBehaviour{
     private EventHolder eh;
     private void Start(){
         GameObject obj = GameObject.Find("ObjectName");
         eh = obj.GetComponent<EventHolder>();
         if(eh != null){ eh.RaiseEvent += ListenEvent }
     }
     private void OnDestroy(){
         if(eh != null){
              eh.RaiseEvent -= ListenEvent;
              eh = null;
         }
     }
     private void ListenEvent(object sender, EventArg arg){}
}

这是遵循.NET事件模式,但您可以跳过整个EventArg进程并使用Action。你的选择。