看到很多人依然還是通過最原始的方法給button綁定事件並處理,這種通過Find往子集一個個的查找,獲取到后再綁定事件這種操作很費事,有些人則是對查找對象寫了個方法自動往子集遍歷更方便獲取對象,但還是要一個個綁定。所以看到這里給大家說個簡單的方式,要說的這種方式其實也很簡單能夠看到MVC的核心思想的影子。
先來講解下思路再看代碼,這樣如果思路清晰了,不看代碼你也知道我想怎么做。
思路是 將在初始化時獲取到所有Button然后進行統一綁定到一個處理方法,在這個方法里處理一系列的工作,根據button的Name就可知道當前被點擊的是哪個button,從而進行處理。
所以在初始化的時候獲取並綁定button這個工作可以寫在一個基類里,這樣繼承后的類就只需要關注事件的處理。而綁定事件的所有Button我們都不需要一個個查找獲取到后再綁定事件了。
表達能力有限,寫下代碼應該能了解我想說的。
1.寫一個基類,用於對子集下所有Button進行綁定事件
using UnityEngine; using UnityEngine.UI; public class AbsButton : MonoBehaviour { protected Button[] BtnArr; protected virtual void Awake() { //獲取子集下所有Button的集合 BtnArr = transform.GetComponentsInChildren<Button>(true); //將所有Button的點擊事件綁定到HandlerNotification方法上 for (int i = 0; i < BtnArr.Length; i++) { Transform TARGET = BtnArr[i].transform; BtnArr[i].onClick.AddListener(() => { HandlerNotification(TARGET); }); } } public virtual void HandlerNotification(Transform target) { } }
至此已經可以看到這個對象下子集中的所有button我們都不用一個個查找了,而且也都綁定了點擊事件。下一步我們就只需要寫一個類繼承他,然后再其中專注於事件的處理。且Button只負責發送自身Tranform並不需要知道其他的。
2.寫一個處理類,並繼承AbsButton 通過HandlerNotification處理Butoon事件
public class PageHandler : AbsButton { public override void HandlerNotification(Transform target) { switch (target.name) { //通過不同的名稱可以知道當前點擊了哪個button然后就可以對其進行處理. case "Btn_NextModel": print("Test"); target.gameObject.SetActive(false); break; case "Btn_SayHello": print("Hello"+target); break; } //(別忘了父級里還有個Button集合,這個運用起來還是很方便的,比如我對一個button點擊后會顯示當前選擇標記,其他的button就需要隱藏當前選擇標記) } }
這樣處理起來是不是簡單又簡潔。比如有一個父級下有很多button要處理,我們只需寫一個處理類腳本掛在父級上就可以處理所有事件了。
即使要處理的Button很多這個處理類要寫的內容很多,但是這種邏輯條理清晰的處理方式依然是好的方式。
好的,希望都能跳過繁瑣的原始方式,讓自己更輕松些。
再提一個,HandlerNotification這個方法要靈活使用,比如添加一個過濾條件使符合過濾條件的button都被過濾掉不處理。