在上一篇,我们在 MonoBehaviourSimplify 中集成了消息功能。而在做消息功能的过程中,又接触了对象池实现了一个非常简单版本。
今天呢我们在接着学习。
我们先回顾下 MonoBehaviourSimplify 中关于消息功能的使用方法。
注册消息,直接用 RegisterMsg,而注销则在 OnDestroy 的时候统一进行注销。
那么单独注销时候怎么办呢?这是第一个问题。
第二个问题是,发送消息,我们使用的是 MsgDispatcher.Send 这个方法。
和我们的注册消息的方法不是统一的。这是第二个问题。
第一个问题解决很简单,只要增加针对一个消息注销的方法就好了。
代码如下:
public partial class MonoBehaviourSimplify
{
protected void UnRegisterMsg(string msgName)
{
var selectedRecords = mMsgRecorder.FindAll(recorder => recorder.Name == msgName);
selectedRecords.ForEach(selectRecord =>
{
MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);
mMsgRecorder.Remove(selectRecord);
selectRecord.Recycle();
});
selectedRecords.Clear();
}
protected void UnRegisterMsg(string msgName, Action
FindAll 是一个查询方法,在 mMsgRecorder 内查询出所有符合条件的项。代码没有太大的难度。
不过在使用上要注意一下,如果是要重复注册并且需要注销的消息,最好是用成员方法来接收,而不是用委托接收,原因是如果是单独注销这类消息的时候,最好是用上边代码的第二种注销方法,用第一种的话,可能把当前脚本之前注册的同名消息都会注销掉。不过这是极少数的情况,一般笔者些项目根本用不到单独注销,而是全部交给了 OnDestroy 处理。
这样第一个问题算是解决了
接下来是我们第二个问题。
第二个问题是 API 不统一的问题。这个问题要解决起来很简单。只要实现一个 Send 方法就好了,而 Send 中主要逻辑有 MsgDispatcher.Send 完成。
代码如下:
protected void SendMsg(string msgName, object data)
{
MsgDispatcher.Send(msgName, data);
}
到此呢,我们的 API 就统一了。而第十四个示例也就算 OK 了。
全部代码如下:
using System;
using UnityEngine;
namespace QFramework
{
public partial class MonoBehaviourSimplify
{
protected void UnRegisterMsg(string msgName)
{
var selectedRecords = mMsgRecorder.FindAll(recorder => recorder.Name == msgName);
selectedRecords.ForEach(selectRecord =>
{
MsgDispatcher.UnRegister(selectRecord.Name, selectRecord.OnMsgReceived);
mMsgRecorder.Remove(selectRecord);
});
selectedRecords.Clear();
}
protected void UnRegisterMsg(string msgName, Action
这样我们的第十四个示例就完成了,可以进行一次导出了。
今天的内容就这些,我们下一篇再见,拜拜~
转载请注明地址:凉鞋的笔记:liangxiegame.com
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。