Unity Button事件的簡潔處理


看到很多人依然還是通過最原始的方法給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都被過濾掉不處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM