说在前面
- Unity版本:2017.4.37
- NGUI版本:3.11.2
- 其他:本篇文章中使用到了NGUI插件,但是不影响理解方法。同时,涉及了c#的委托,和函数指针有些类似,不熟悉的建议查阅相关资料
说明
- 通常按钮是放在某个容器中,例如Panel,并且这个容器可能包含不止一个按钮(例如关闭、主要功能等),如果为每一个按钮都“直接”绑定相应的事件,就不便于管理。
- 一个相对合适的实践是这样的,在每一个button类中声明委托,在包含这些button“容器类”中确定每一个button中委托的指向,这样就可以在这个“容器类”中统一管理该容器下所有button的事件(如上图)。
实例
-
界面
-
层次结构如下
-
Panel
配置如下,最后的Panel(Script)
为自定义脚本(见后面代码),需要将上面的button1/2/3
拖动过去(或者点后面的小圆点)
-
Button
配置如下,其他两个基本相同,注意Box Collider
;Button Listener
为自定义脚本(代码见后面)
-
-
代码
Panel
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Panel : MonoBehaviour { public GameObject button1; // 对应上面panel脚本中的button1 public GameObject button2; public GameObject button3; private void Awake() { ButtonListener.Get(button1).onClick = OnButton1Click; // 确定每一个button委托的指向 ButtonListener.Get(button2).onClick = OnButton2Click; ButtonListener.Get(button3).onClick = OnButton3Click; } private void OnButton1Click(GameObject go) // button1对应的click事件 { Debug.Log("Button 1 clicked!"); } private void OnButton2Click(GameObject go) { Debug.Log("Button 2 clicked!"); } private void OnButton3Click(GameObject go) { Debug.Log("Button 3 clicked!"); } }
ButtonListener
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ButtonListener : MonoBehaviour { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; void OnClick() { if(onClick != null) // 若该委托不为空 { onClick(gameObject); // 那么就调用该委托(指向的函数),gameObject为自身 } } public static ButtonListener Get(GameObject go) { ButtonListener listener = go.GetComponent<ButtonListener>(); if (listener == null) listener = go.AddComponent<ButtonListener>();// 防止未创建 return listener; } }
-
结果
-
界面
-
运行后,点击对应的按钮,在
Console
输出结果如下
-