1. 程式人生 > >uGUI使用程式碼動態新增Button.OnClick()事件(Unity3D開發之十二)

uGUI使用程式碼動態新增Button.OnClick()事件(Unity3D開發之十二)

猴子原創,歡迎轉載。轉載請註明: 轉載自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);