uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)

猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!

原文地址: http://blog.csdn.net/cocos2der/article/details/42705885

uGUI出来这么久了,也一直没好好用用,主要是公司项目不用U3D。昨晚用了下Button,还是比较爽的。

主要说下用代码添加button.OnClick()事件的方法(使用属性面板添加的方法就不说了)

一、创建2D UI Panel,添加你需要的Button。

我添加了3个Button:BtnStart,BtnShop,BtnLeaderboards。

二、添加脚本

 

[csharp] view plain copy

在CODE上查看代码片派生到我的代码片

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine.Events;
  5. using UnityEngine.UI;
  6. public class MainMenu : MonoBehaviour {
  7.     // Use this for initialization
  8.     void Start () {
  9.         List<string> btnsName = new List<string>();
  10.         btnsName.Add(“BtnPlay”);
  11.         btnsName.Add(“BtnShop”);
  12.         btnsName.Add(“BtnLeaderboards”);
  13.         foreach(string btnName in btnsName)
  14.         {
  15.             GameObject btnObj = GameObject.Find(btnName);
  16.             Button btn = btnObj.GetComponent<Button>();
  17.             btn.onClick.AddListener(delegate() {
  18.                 this.OnClick(btnObj);
  19.             });
  20.         }
  21.     }
  22.     public void OnClick(GameObject sender)
  23.     {
  24.         switch (sender.name)
  25.         {
  26.         case ”BtnPlay”:
  27.             Debug.Log(“BtnPlay”);
  28.             break;
  29.         case ”BtnShop”:
  30.             Debug.Log(“BtnShop”);
  31.             break;
  32.         case ”BtnLeaderboards”:
  33.             Debug.Log(“BtnLeaderboards”);
  34.             break;
  35.         default:
  36.             Debug.Log(“none”);
  37.             break;
  38.         }
  39.     }
  40.     // Update is called once per frame
  41.     void Update () {
  42.     }
  43. }

ok,测试一下,可以玩耍了。

 

================== 2015-03-07 更新 ======================

有人问道如果是Toogle如果添加呢?其实很简单的。

 

[csharp] view plain copy

在CODE上查看代码片派生到我的代码片

  1. // Add click listenner for buttons
  2.         Hashtable btnsName = new Hashtable();
  3.         btnsName.Add(“BtnNewGame”, ”Button”);
  4.         btnsName.Add(“BtnContinue”, ”Button”);
  5.         btnsName.Add(“BtnChallenge”, ”Button”);
  6.         btnsName.Add(“BtnMoreGame”, ”Button”);
  7.         btnsName.Add(“BtnRank”, ”Button”);
  8.         btnsName.Add(“BtnMusic”, ”Toggle”);
  9.         btnsName.Add(“BtnSound”, ”Toggle”);
  10.         foreach(DictionaryEntry btnInfo in btnsName)
  11.         {
  12.             GameObject btnObj = GameObject.Find(btnInfo.Key as string);
  13.             if (btnInfo.Value == ”Button”) {
  14.                 Button btn = btnObj.GetComponent<Button>();
  15.                 btn.onClick.AddListener(delegate() {
  16.                     // this.OnClick(btnObj);
  17.                 });
  18.             }
  19.             else if (btnInfo.Value == ”Toggle”) {
  20.                 Toggle btn = btnObj.GetComponent<Toggle>();
  21.                 btn.onValueChanged.AddListener(delegate(bool isOn) {
  22.                     // this.OnValueChanged(isOn, btnObj);
  23.                 });
  24.             }
  25.         }

================== 2016-07-19 更新 ======================

我现在的做法是有一个BaseUIView,会在这里统一注册button事件,然后子类自己实现OnClickButtons函数。

当然,BaseUIView中还可以做些UI的显示和影藏的事件,然后配合UIManager使用来管理UI的显示层级问题。

 

 

[csharp] view plain copy

在CODE上查看代码片派生到我的代码片

  1. // 绑定buttons event
  2. Button[] buttons = GetComponentsInChildren<Button> (true);
  3. foreach (var item in buttons) {
  4. Button btn = item;
  5. btn.onClick.AddListener(delegate() {
  6. this.OnClickButtons(btn.gameObject);
  7. });
  8. }
  9. // button actions
  10. protected abstract void OnClickButtons(GameObject sender);


发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)

最新评论