1. 程式人生 > >重複是萬惡之源(一)

重複是萬惡之源(一)

不知道為啥最近越來越懶了,能一次做完的事絕對不做第二次,最近對每次寫 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;
        }
    }
}

效果如下: