您的位置:首页 > 产品设计 > UI/UE

uGUI使用代码动态添加Button.OnClick()事件

2016-11-18 18:38 639 查看


uGUI使用代码动态添加Button.OnClick()事件

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

Unity3d中的按钮响应事件:

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

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



二、添加脚本

[csharp] view
plain copy

 





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,测试一下,可以了。

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

[csharp] view
plain copy

 





// 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);  

                });  

            }  

        }  

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

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

[csharp] view
plain copy

 





// 绑定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);  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# Unity3d