绑定事件的本质是delegate委托,C#本身封装了一个Event类(配合EventArgs使用更方便),Unity又封装了UnityEvent和UnityAction(然后就可以在unity的inspector里通过拖动脚本或物体来绑定事件)。
所以addlistener方法除了可以传入void参数的方法,使用 addlistener(nameof(methodname));
也可以传入委托,或使用表达式主体,即把委托声明放在了表达式里而不是由编译器来构造委托。
事先强调一下这一点,之后就不用再回答一个低级问题了:“如何在addlistener()时为订阅的事件(方法)传入事件参数?”
UGUI几种绑定事件的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class NewBehaviourScript : MonoBehaviour { Button btn; Toggle toggle; InputField inputField; public delegate void ClickEvent(); public ClickEvent clickEvent; void Start() { btn.onClick.AddListener(DoSomething); btn.onclick.AddListener(nameof(DoSomething)); btn.onClick.AddListener(() => { DoSomething(); Debug.Log("0"); }); btn.onClick.AddListener(delegate () { DoSomething(); Debug.Log("0"); }); clickEvent += DoSomething; EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger>(); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = EventTriggerType.PointerClick; entry.callback = new EventTrigger.TriggerEvent(); entry.callback.AddListener(A);
toggle.onValueChanged.AddListener(ToggleAction); toggle.onValueChanged.AddListener(delegate { DoSomething()); }); toggle.onValueChanged.AddListener(delegate (bool value) { DoSomething()); }); toggle.onValueChanged.AddListener((value) => { if (value) { } else { } });
inputField.onValueChanged.AddListener(delegate { DoSomething(); }); inputField.onEndEdit.AddListener(DoSomethingStr); }
void DoSomething() { Debug.Log("Do Something");} void DoSomethingStr(string str) { Debug.Log(str); } void A(BaseEventData data) { }
void ToggleAction(bool b) { } }
|