简介
实例
-
简单调用
using UnityEngine; public class DelegateExample : MonoBehaviour { //Step1. 定义类型----为Delegate定义一种函数原型 public delegate void MyDelegate(int args); //Step2. 声明变量----声明一个Delegate变量 public MyDelegate myDelegate; private void Start() { //Step3. 变量赋值----引用Delegate变量实现相应的函数 myDelegate = PrintNum; myDelegate(5); } public void PrintNum(int num) { print("Print number: " + num); } }
-
C# Event
把Event想象成一个视频作者,并且他还具有一大堆热情的粉丝,每天都在等待新视频的发布。为了在第一时间收看到新发布的视频,粉丝们大多会选择订阅视频作者,这样作者更新时你就会收到一条即时消息。event只负责告诉每个函数什么时候被调用,这些函数到底干了什么,event并不关心
//Idol.cs 广播消息 定义的event相当于源头,只要调用了该事件,都会引起注册该事件的人调用相应的注册方法 public class Idol : MonoBehaviour { public delegate void IdolBehaviour(string behaviour); public static event IdolBehaviour IdolDoSomethingHandler; private void Start() { //Idol 决定搞事了, 如果他还有粉丝的话, 就必须全部都通知到 if (IdolDoSomethingHandler != null) { IdolDoSomethingHandler("Idol give up writing."); } } }
//SubscriberA.cs 订阅消息 很早注册订阅了,当event发送了,那么就会调用对应方法 public class SubscriberA : MonoBehaviour { private void OnEnable() { //注册事件 相当于偶像突然有什么事件了,就会立即知道 Idol.IdolDoSomethingHandler += LikeIdol; } //取消注册 private void OnDisable() { Idol.IdolDoSomethingHandler -= LikeIdol; } /// 粉丝A是一个脑残粉 public void LikeIdol(string idolAction) { print(idolAction + " I will support you forever!"); } }
-
Unity Event
主要是可以拖拽很方便,用Serializable序列化IdolEvent,这样可以在Editor中显示
//Idol.cs 需要的event直接继承自UnityEvent using UnityEngine; using UnityEngine.Events; //使用Serializable序列化IdolEvent, 否则无法在Editor中显示 [System.Serializable] public class IdolEvent : UnityEvent<string> { } public class Idol : MonoBehaviour { public IdolEvent idolEvent; private void Start() { //Idol 广播消息 if (idolEvent == null) { idolEvent = new IdolEvent(); } idolEvent.Invoke("Idol give up writing."); } }
//SubscriberA.cs 如果通过拖拽,只需要写个方法即可 //不通过拖拽 也可以注册 Addlistener using UnityEngine; public class SubscriberB : MonoBehaviour { public Idol myIdol; private void OnEnable() { //注册事件 myIdol.idolEvent.AddListener(HateIdol); } private void OnDisable() { myIdol.idolEvent.RemoveListener(HateIdol); } public void HateIdol(string idolAction) { print(idolAction + " I will hate you forever!"); } }
-
C# Action+Unity Action
其实是封装好的委托
//Data.cs 定义委托,值改变给委托 using UnityEngine; using System.Collections; public class Data { public System.Action<int, int> onDataChange; public UnityAction<int, int> onDataChange1; public int blood { get; set; } public int blue { get; set; } public Data() { } public void SetData(int blood, int blue) { this.blood = blood; this.blue = blue; onDataChange(this.blood, this.blue); onDataChange1(this.blood, this.blue); } }
//Test.cs 可以UI显示 public class Test : MonoBehaviour { private Data _Data; private void Start() { _Data = new Data(); _Data.onDataChange += ChangeView; _Data.onDataChange1 += ChangeView; } private void ChangeView(int a,int b) { Debug.LogError(a); } void Update() { _Data.SetData(1, 2); } }
-
Unity Event+Action
- action是委托,可以注册很多方法
- event是事件,能够注册方法,也能action
- event的Invoke()方法可以一次性调用所有UnityAction
//不带参数UnityEvent不是抽象类,可以直接实例化 using UnityEngine; using System.Collections; using UnityEngine.Events; public class UnityActionAndEvent : MonoBehaviour { public UnityAction action; public UnityEvent myEvent = new UnityEvent(); void Start() { action = new UnityAction(MyFunction); action += MyFunction2; myEvent.AddListener(action); } void Update() { if (Input.GetKeyDown(KeyCode.P)) { myEvent.Invoke(); } } public void MyFunction() { print("Hello: "); } public void MyFunction2() { print("Hello2: "); } } //带参数UnityEvent是抽象类,需要自己声明一个类 public class MyEvent:UnityEvent<int>{} public class UnityActionWithParameter : MonoBehaviour { public MyEvent myEvent = new MyEvent(); public UnityAction<int> action; void Start () { action= new UnityAction<int>(MyFunction); action += MyFunction2; myEvent.AddListener(action); } void Update () { if(Input.GetKeyDown(KeyCode.A)) { myEvent.Invoke(10); } } public void MyFunction(int i) { print (i); } public void MyFunction2(int i) { print(i*2); } }
-
其他事件(button.onClick等,通过Addlistener添加Action,Action可以注册多个方法)
using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; public class UnityActionExample : MonoBehaviour { Button m_AddButton; Renderer m_Renderer; private UnityAction m_MyFirstAction; float m_MyNumber; void Start() { m_AddButton = GetComponent<Button>(); m_Renderer = GetComponent<Renderer>(); m_MyFirstAction += MyFunction; m_MyFirstAction += MySecondFunction; m_AddButton.onClick.AddListener(m_MyFirstAction); } void MyFunction() { m_MyNumber++; Debug.Log("First Added : " + m_MyNumber); } void MySecondFunction() { m_Renderer.material.color = Color.blue; Debug.Log("Second Added"); } }
参考
https://blog.csdn.net/qq_28849871/article/details/78366236
https://docs.unity3d.com/ScriptReference/Events.UnityAction.html
网友评论