一般我们在做游戏开发过程中都会遇到需要使用按钮的时候,通过点击按钮来实现某些需求,比如开始游戏,请求好友列表等等,今天我们就NGUI下按钮的几种响应方式做出总结:
一、直接响应
我们可以直接在当前对象的脚本上实现OnClick方法如下:
当然了,我们也可以将按钮响应指向当前脚本的其他方法(必须是public属性下方法,不然不可见)
缺点:不直观,效率比较低
二、使用SendMessage
选中当前按钮,选择AddComponent->NGUI->interaction->ButtonMessage为按钮添加UIButtonMessage脚本组件
Target:响应按钮消息的游戏对象。
Function Name:响应按钮消息的游戏对象的脚本方法
Trigger:按钮的响应方式,有单击,鼠标在按钮上、鼠标在按钮外、双击、按下鼠标、松开鼠标等方式
Include Children:是否让该对象的所有子对象也发送这个点击事件。
void Send ()
{
if (string.IsNullOrEmpty(functionName)) return;
if (target == null) target = gameObject;
if (includeChildren)
{
Transform[] transforms = target.GetComponentsInChildren<Transform>();
for (int i = 0, imax = transforms.Length; i < imax; ++i)
{
Transform t = transforms[i];
t.gameObject.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver);
}
}
else
{
target.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver);
}
}
可以看到就是通过对象调用SendMessage方法来实现的,这种方式比较古老,引擎现已不推荐使用
缺点:不适用于3D物体
3、直接在UIButton添加事件
这个方法和第一种sendMessage方式大同小异,但是较前者直观些。
缺点:效率略低,同样不适用于3d物体
4、Event Listener(推荐使用)
选中当前按钮,选择AddComponent->NGUI->interaction->ButtonMessage为按钮添加Event Listener脚本组件
这种方式你可以在任何脚本中实现按钮的点击事件,写法以下两种都行
void Awake()
{
//获取需要监听的按钮对象
GameObject button = GameObject.Find("TestBtn");
//设置这个按钮的监听,指向本类的ButtonClick方法中。
//UIEventListener.Get(button).onClick = BtnClick;
UIEventListener.Get(button).onClick = (obj) =>{
Debug.Log("GameObject " + obj.name);
};
}
//计算按钮的点击事件
void BtnClick(GameObject button)
{
Debug.Log("GameObject " + button.name);
}
这种方式,效率相对以上其他较好,管理方便,推荐使用
5、EventDelegate
这种方式最简洁,效率也较高,不用添加任何组件,只需讲代码挂载到任何对象上,并赋予btn需要响应的按钮对象
public class tet : MonoBehaviour {
public UIButton btn;//这里必须是UIButton类型
// Use this for initialization
void Start()
{
EventDelegate.Add(btn.onClick, BtnClick);
}
public void BtnClick()
{
Debug.Log("GameObject ");
}
}