uGUI使用程式碼動態新增Button.OnClick()事件(Unity3D開發之十二)
阿新 • • 發佈:2019-02-07
猴子原創,歡迎轉載。轉載請註明: 轉載自Cocos2Der-CSDN,謝謝!
uGUI出來這麼久了,也一直沒好好用用,主要是公司專案不用U3D。昨晚用了下Button,還是比較爽的。
主要說下用程式碼新增button.OnClick()事件的方法(使用屬性面板新增的方法就不說了)
一、建立2D UI Panel,新增你需要的Button。
我添加了3個Button:BtnStart,BtnShop,BtnLeaderboards。
二、新增指令碼
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.Events; using UnityEngine.UI; public class MainMenu : MonoBehaviour { // Use this for initialization void Start () { List<string> btnsName = new List<string>(); btnsName.Add("BtnPlay"); btnsName.Add("BtnShop"); btnsName.Add("BtnLeaderboards"); foreach(string btnName in btnsName) { GameObject btnObj = GameObject.Find(btnName); Button btn = btnObj.GetComponent<Button>(); btn.onClick.AddListener(delegate() { this.OnClick(btnObj); }); } } public void OnClick(GameObject sender) { switch (sender.name) { case "BtnPlay": Debug.Log("BtnPlay"); break; case "BtnShop": Debug.Log("BtnShop"); break; case "BtnLeaderboards": Debug.Log("BtnLeaderboards"); break; default: Debug.Log("none"); break; } } // Update is called once per frame void Update () { } }
ok,測試一下,可以玩耍了。
================== 2015-03-07 更新 ======================
有人問道如果是Toogle如果新增呢?其實很簡單的。
// Add click listenner for buttons Hashtable btnsName = new Hashtable(); btnsName.Add("BtnNewGame", "Button"); btnsName.Add("BtnContinue", "Button"); btnsName.Add("BtnChallenge", "Button"); btnsName.Add("BtnMoreGame", "Button"); btnsName.Add("BtnRank", "Button"); btnsName.Add("BtnMusic", "Toggle"); btnsName.Add("BtnSound", "Toggle"); foreach(DictionaryEntry btnInfo in btnsName) { GameObject btnObj = GameObject.Find(btnInfo.Key as string); if (btnInfo.Value == "Button") { Button btn = btnObj.GetComponent<Button>(); btn.onClick.AddListener(delegate() { // this.OnClick(btnObj); }); } else if (btnInfo.Value == "Toggle") { Toggle btn = btnObj.GetComponent<Toggle>(); btn.onValueChanged.AddListener(delegate(bool isOn) { // this.OnValueChanged(isOn, btnObj); }); } }
================== 2016-07-19 更新 ======================
我現在的做法是有一個BaseUIView,會在這裡統一註冊button事件,然後子類自己實現OnClickButtons函式。
當然,BaseUIView中還可以做些UI的顯示和影藏的事件,然後配合UIManager使用來管理UI的顯示層級問題。
// 繫結buttons event Button[] buttons = GetComponentsInChildren<Button> (true); foreach (var item in buttons) { Button btn = item; btn.onClick.AddListener(delegate() { this.OnClickButtons(btn.gameObject); }); } // button actions protected abstract void OnClickButtons(GameObject sender);