uGUI使用代码动态添加Button.OnClick()事件
原文地址: http://blog.csdn.net/cocos2der/article/details/42705885
Unity3d中的按钮响应事件:
一、创建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 {
-
-
- 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;
- }
- }
-
-
- void Update () {
-
- }
- }
ok,测试一下,可以了。
有人问道如果是Toogle如果添加呢?其实很简单的。
-
- 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() {
-
- });
- }
- else if (btnInfo.Value == "Toggle") {
- Toggle btn = btnObj.GetComponent<Toggle>();
- btn.onValueChanged.AddListener(delegate(bool isOn) {
-
- });
- }
- }
我现在的做法是有一个BaseUIView,会在这里统一注册button事件,然后子类自己实现OnClickButtons函数。
当然,BaseUIView中还可以做些UI的显示和影藏的事件,然后配合UIManager使用来管理UI的显示层级问题。
-
- Button[] buttons = GetComponentsInChildren<Button> (true);
- foreach (var item in buttons) {
- Button btn = item;
- btn.onClick.AddListener(delegate() {
- this.OnClickButtons(btn.gameObject);
- });
- }
-
-
-
- protected abstract void OnClickButtons(GameObject sender);