有时候UI界面中会涉及大量按钮,一个一个的添加onClick事件太麻烦了,我们可以利用代码为Button组件添加事件,此外当涉及大量按钮时,我们完全可以通过按钮名称来获取按下按钮是要响应什么事件,我这里做的是一个游戏中换装的界面,因为装备、武器、动画、皮肤很多,所以我把按钮组织成这样:
把所有的按钮放在一个空物体下,直接用Transform.getchild(i);
获取对应按钮即可。按钮的名称也对应着相应事件:Monster是角色种类,Costume是服饰,Action是动画,Weapon是武器,_后面就是具体内容,这样我们可以直接知道要切换角色还是切换服饰还是切换动画还是切换武器。
另外就是用到的API,在NGUI中这件事很方便,按钮的名称可由UIButton.current.name
获取,用UIButton.current.name.Split('_')
获取前后字符串。但在UGUI的Button组件对应的Button的API中并没有这样方便的属性,所以要用到EventSystem.current.currentSelectedGameObject.name
来获取按钮名称(也很方便,但ButtonAPI中没有这个,可能因为unity想更统一存放)。这个类在UnityEngine.EventSystems
命名空间下。
具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// 响应按钮事件(通过按钮名称直接调用响应方法)
/// </summary>
public class ButtonClickEvent : MonoBehaviour
{
private void Start()
{
Button tmp;
//让所有button都响应OnButtonClick事件
for(int i = 0; i < transform.childCount; i++)
{
tmp = transform.GetChild(i).GetComponent<Button>();
tmp.onClick.AddListener(OnButtonClick);
}
}
public void OnButtonClick()
{
var buttonName = EventSystem.current.currentSelectedGameObject.name;//按钮名称
var arr = buttonName.Split('_');//以_区分
var func = arr[0];//根据这个名称得知要响应的方法
var theObject = arr[1];//相当于方法的参数/作用物体
switch (func)
{
case "":
......//自己定义对应方法
break;
}
}
}