事件
事件的定义和使用
//委托
public delegate void MsgEvent(string msg);
//定义事件
public event MsgEvent msgEvent;
// Start is called before the first frame update
void Start(){
//添加事件回调
msgEvent += MassageManager_msgEvent;
}
private void MassageManager_msgEvent(string msg){
print("msg");
//TODU
}
//调用事件
public void UseEvent(){
msgEvent("Hell 主程");
}
实例:
问题:项目中的消息接收较为频繁,我原本在Update里进行判断的,可能某一帧内会同时收到多个消息,这样会导致消息处理不及时,某些消息未处理就没了,解决方案:使用队列和事件来处理消息,感谢
1.在接收消息的地方把消息存入队列
public static Queue<string> Msg = new Queue<string>();//创建队列
private void AcceptMessage(string mess)
{
//Debug.Log(message);
Msg.Enqueue(mess);//添加消息到队列末尾
//print("收到消息:" + mess);
}
2.定义事件(带参),每帧检测消息队列是否为空
public delegate void MessageHander(string msg);//委托
public class Bth_Invok : MonoBehaviour {
public static event MessageHander msgEvent; //事件
void Start()
{
msgEvent += AcceptNetWorkMessage_msgEvent;//为事件添加回调函数
}
private void AcceptNetWorkMessage_msgEvent(string str)//回调函数
{
print("msg");
//TODU
}
// Update is called once per frame
void Update () {
if(***.Msg.Count>0)//如果消息队列不空
{
msgEvent(***.Msg.Dequeue());//取出队列中的第一条消息,调用事件msgEvent
}
}
}
感谢启程大佬的指导🤣