背景是开发游戏中的消息系统,进入游戏时会自动从服务器中下载离线时没收到的消息,所以,UGUI会根据收到的消息的数量,动态生成这个数量的消息点击按钮,放在消息列表中,但是问题出在:
由于按钮是批量生成的,所有的按钮公用一个点击事件,但是每个按钮根据服务器传来的参数不同,要生成不同的消息框和内容,所以急需一个能够传递参数的点击事件,在查找资料的过程中,看到了一篇博客http://www.tuicool.com/articles/nyeqie,这篇文章中使用委托的方法进行传参,是我目前能够解决项目中问题的方法。
下面看代码:
由于按钮需要大量Load所以使用了ResMgr框架,框架会在后面的开发回顾中贴出
/// <summary>
/// 点击了消息查看按钮
/// </summary>
private void ButtonClickmessage()
{
Debug.Log("即将查看消息");
btn_message.GetComponent<MessageButtonShow>().flag = false;
while (messageStack.Count > 0)
{
//从资源中加载按钮
ResMgr.Instance.Load(UIDef.btn_msg, this);
}
img_message.SetActive(true);
}
当点击消息查看按钮,会自动从先前保存的消息的堆栈里逐条读取数据,并且生成按钮。
ResMgr.Instance.Load(UIDef.btn_msg, this);
这句代码就是生成操作,会有一个加载完成的回调函数,下面是回调函数:
/// <summary>
/// 资源加载完成后的回调
/// </summary>
/// <param name="asset"></param>
public void Finish(object asset)
{
//消息出栈
protos.ReturnMessage.ResSysMessage.MessageModel msg = messageStack.Pop();
GameObject objMsg = Instantiate(asset as GameObject);
objMsg.gameObject.SetActive(true);
Button btn_msg = objMsg.GetComponent<Button>();
btn_msg.transform.FindChild("Text_t").GetComponent<Text>().text = msg.type;
btn_msg.transform.FindChild("Text_c").GetComponent<Text>().text = msg.title;
//将消息赋值给数据传输工具类
btn_msg.GetComponent<DataTransfer>().ModelTransfer = msg;
//添加的消息列表
MsgList.Add(btn_msg);
//添加按钮点击事件
btn_msg.onClick.AddListener(delegate () { this.OnClickMsg(msg); });
//将按钮放到消息面板下
btn_msg.transform.parent=img_message_box.transform;
}
回调函数的参数是加载完成的物体
这里一步一步的生成按钮并添加点击事件
btn_msg.onClick.AddListener(delegate () { this.OnClickMsg(msg); });
这句话也就是这篇文章的主题。传递一个有参数的方法用于传递参数。这样点击事件就能接收参数了。