重複是萬惡之源(一)
阿新 • • 發佈:2018-11-19
不知道為啥最近越來越懶了,能一次做完的事絕對不做第二次,最近對每次寫 button 事件都要重新寫它的點選事件是真的煩,果斷不能忍
GetComponent<Button>().onClick.AddListener(()=> {
print("這是按鈕的點選事件");
});
我在想有沒有一次性註冊完這些點選事件,後面只需要根據這個 button 的名字或者是id就ok了,剛好有時間就寫一下
如圖,在層次結構裡有不同的Button,讓我來一次性獲取這些 button ,註冊點選事件,下面兩個指令碼都掛 canvas 上,初始化
下面兩個指令碼 一種是通過傳 id 一種是通過 傳 按鈕的名字,看個人喜好吧,我這預設的是傳按鈕的名字,id 的方法我註釋了
程式碼如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class MyEventArgs { // 每個button的編號,通過 id 取值 public int btnID; // 通過 btn 的名字取值 public string btnName; // 每個 Button 本身 public GameObject obj; } public class UIBtnsEvent : MonoBehaviour { Button[] buttons; // 滑鼠點選委託 public delegate void ButtonClickDelegate(MyEventArgs arg); public static ButtonClickDelegate ButtonClick; /// <summary> /// 通過 id 取值 /// </summary> //void Start() //{ // buttons = GetComponentsInChildren<Button>(); // for (int i = 0; i < buttons.Length; i++) // { // MyEventArgs arg = new MyEventArgs(); // arg.id = i + 1; // arg.obj = buttons[i].gameObject; // buttons[i].onClick.AddListener(() => OnButtonClickAction(arg)); // } //} /// 通過 btn 的名字取值 void Start() { buttons = GetComponentsInChildren<Button>(); for (int i = 0; i < buttons.Length; i++) { MyEventArgs arg = new MyEventArgs(); arg.btnName = buttons[i].gameObject.name; arg.obj = buttons[i].gameObject; buttons[i].onClick.AddListener(() => OnButtonClickAction(arg)); } } void OnButtonClickAction(MyEventArgs arg) { if (ButtonClick != null) { ButtonClick(arg); } } }
怎麼用:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BtnOnClickTest : MonoBehaviour { void Start() { // UICtrWinScript.ButtonClick += Onclick; UIBtnsEvent.ButtonClick += OnClickByName; } void OnClickByName(MyEventArgs arg) { switch (arg.btnName) { // 這裡是你按鈕的名字 case "Button": print("第一個按鈕"); break; case "Button (1)": print("第二個按鈕"); break; default: break; } } /// <summary> /// 通過 id 取值的方法 /// </summary> /// <param name="arg"></param> void OnClickByID(MyEventArgs arg) { print(arg.btnID); switch (arg.btnID) { case 1: print("button1"); break; case 2: print("button2"); break; default: break; } } }
效果如下: