-
Notifications
You must be signed in to change notification settings - Fork 2
Event
Event是BlackFire Framework内部提供的功能模块,其目的是提供一个有效的信息中介代理,对任意层级或者同级流程的逻辑业务进行有效解耦。
Event的设计采用的是事件主题的形式,其中涉及事件主题的创建者,参与事件主题的发言人还有参与该事件主题的听众们。
这里值得注意的是,不论讨论任何主题,总是不能缺少“谁说的”和“说了什么内容”,毕竟处理什么事情的时候知道是谁做的真的很关键。
在此设计中,事件主题的创建者也可以充当发布者或者听众,在处理具体的情景这很常见。
Event 规范
Event 的事件委托采用 EventHandler,事件主题创建者、发布者、监听者都必须标明 Sender (ps:谁触发的事件) 和 EventArgs (ps:触发事件时传递的信息)。
- GUI 模块扩展
-
EventServer:这个是内部启动的MiniHttpServer,他将充当小型服务器并用于处理简单的HTTP协议,这样开发人员就可以自定义交互协议与框架程序进行通讯了(ps:未来将使用 websocket)。
-
事件主题面板:这个面板提供最基本的参数类型,开发者可以在程序发布后在面板触发一个调试事件(目前仅仅支持EventArgs.Empty和DebuggerEventArgs的类型)。
-
日志面板:记录事件主题的触发,并且会有触发平台的检测与提示。
Args:Type支持 int 、 float 、 double 、decimal、char、string 类型,用例:GUI上输入 string : Hello world!
- 用例
public static void Fire(string topicName, object sender, EventArgs eventArgs, bool fireNow = true);
中的fireNow为true是指立马触发事件,如果为false那么将会把触发的指令排入主线程的轮询队列同步后才执行,这样设计就很容易去处理异步业务与主线程业务了(ps:目前Unity3D跨线程调用组件是不允许的)。
一个用于记录事件主题的全局类。并且该类推荐使用partial拆分来写,这样团队开发中就不会平凡修改同一个cs而导致仓库冲突了。
public sealed partial class EventTopic
{
public const string BossDropOfBlood = "主题:Boss掉血";
}
一个与事件主题对应的事件参数,即是你需要传递的消息内容。
public sealed class BossDropOfBloodEventArgs : System.EventArgs
{
public BossDropOfBloodEventArgs(int blood)
{
Blood = blood;
}
public int Blood { get; private set; }
public override string ToString()
{
return string.Format("Blood:{0}",Blood);
}
}
接下来我们来模拟一下在具体的业务中抛出事件。这就是前面提及的 “发言人”。
public sealed class EventDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("这里假装在你的单机游戏里面操作玩家角色砍了一刀Boss"))
{
//如果没有创建主题内部自动创建主题,这里就如上文提及的,创建者也可以是发布者或者监听者,这对于懒人模式来说很常见。^_^
BlackFireFramework.Event.Fire(EventTopic.BossDropOfBlood, this, new BossDropOfBloodEventArgs(100));
}
}
}
我们来模拟两个“监听者”,一个是处理UI业务的监听者,一个是处理DB业务的监听者。
public sealed class EventDemo_UIHandler : MonoBehaviour
{
private void Start()
{
//如果没有创建主题内部自动创建主题,这里就如上文提及的,创建者也可以是发布者或者监听者,这对于懒人模式来说很常见。^_^
BlackFireFramework.Event.On(EventTopic.BossDropOfBlood, this, (sender, args) => {
var cargs = args as BossDropOfBloodEventArgs;
Log.Info(string.Format("UI界面减血{0}。 Sender : {1} Args : {2}", cargs.Blood, sender, cargs.ToString()));
});
}
private void OnDestroy()
{
//取消监听
BlackFireFramework.Event.Off(EventTopic.BossDropOfBlood, this);
}
}
public sealed class EventDemo_DBHandler : MonoBehaviour
{
private void Start()
{
//如果没有创建主题内部自动创建主题,这里就如上文提及的,创建者也可以是发布者或者监听者,这对于懒人模式来说很常见。^_^
BlackFireFramework.Event.On(EventTopic.BossDropOfBlood, this,(sender,args)=> {
var cargs = args as BossDropOfBloodEventArgs;
Log.Info(string.Format("数据库写入Boss减血{0}记录。 Sender : {1} Args : {2}", cargs.Blood ,sender, cargs.ToString()));
});
}
private void OnDestroy()
{
//取消监听
BlackFireFramework.Event.Off(EventTopic.BossDropOfBlood, this);
}
}