模块的开始
从这里开始,我们要开始注入模块了
今天、我们先来注入一个消息模块
消息模块是干啥的?
1、发送消息
2、解耦
3、貌似没了
话不多说,上码
public class MessageExample : Test
{
public interface IPub { }
public class Pub : IPub { }
public class Listenner : IMessageListener
{
public Listenner()
{
Framework.env0.modules.Message.Subscribe<IPub>(Listen);
Framework.env0.modules.Message.Subscribe<MessageExample>(this);
}
public void Listen(IMessage message)
{
Log.L(string.Format("Recieve code {0} by type {1}", message.code, message.subject));
}
}
protected override void Start()
{
Listenner listenner = new Listenner();
Log.L("不要太频繁按键,因为 1秒 检测一次按键");
//Framework.env0.modules.Message.fitSubType = false;
Framework.env0.modules.Message.processesPerFrame = 1;
IMessage message = null;
message = Framework.env0.modules.Message.Publish<Pub>(null)
.SetCode(100)
.OnRecycle((msg)=> {
Log.L($"equals {message == msg}");
Log.L($"state {msg.state} err {msg.errorCode}");
Log.L("\n\n");
Log.L("开始按键");
});
Log.L(string.Format("the position is {0} priority is {1}", message.position, message.priority));
}
protected override void Update()
{
var key = Console.ReadKey();
Log.L($"检测到按键 {key.Key} 并且发送消息 , 按键序号为 {(int)key.Key}");
Log.L($"剩余消息条数 {Framework.env0.modules.Message.count}");
for (int i = 0; i < 2; i++)
{
Framework.env0.modules.Message.PublishByNumber(this, null, (int)key.Key - i)
.SetCode((int)key.Key - i)
.OnRecycle((msg) => {
Log.L($"state {msg.state} err {msg.errorCode}");
});
}
}
protected override void Stop()
{
}
}
解析
0、这次的🐎有点长
1、声明 IPub 接口
2、声明 Pub 类 继承自 IPub 接口
3、声明一个 Listenner,去监听 IPub 类型 与 MessageExample 类型
4、对消息模块做一些设置 一帧只处理一次
5、发布 Pub 类型消息一个
6、 在帧函数 内检测到按键,就发消息
让我们来看看输出
我们可以发现 先收到了 Pub 类型的消息
Why?为什么会收到? 我们明明只是注册了 IPub 类型,悲伤那么大
阐述: Pub 类型继承自 IPub
消息模块默认会去匹配子类型 Pub 是 IPub 子类型
如果不需要此功能?
消息模块 有一个属性 fitSubType 置为 false 即可
下面就是 检测到按键,然后发出的消息
因为我们设置了一帧只执行一个,
所以我们可以看到两个执行时间不一样
你可能会问,这写消息都滞后了,我想立刻执行怎么办?
考虑到了
在消息模块的发布方法中,有一个参数叫做优先级
通过优先级可以控制消息的先后,优先级很多 ,如下图
结束
这个消息模块主要功能就只有注册和发布
另外的功能呢是根据消息队列的理念造的
消息队列是什么?卧槽!!!!
hey hey hey
请听 后续 分解