Skip to content
AlanZeng edited this page Nov 21, 2018 · 1 revision

Event 简介

Event是BlackFire Framework内部提供的功能模块,其目的是提供一个有效的信息中介代理,对任意层级或者同级流程的逻辑业务进行有效解耦。

Event 设计

Event的设计采用的是事件主题的形式,其中涉及事件主题的创建者,参与事件主题的发言人还有参与该事件主题的听众们。

Event

这里值得注意的是,不论讨论任何主题,总是不能缺少“谁说的”和“说了什么内容”,毕竟处理什么事情的时候知道是谁做的真的很关键。

在此设计中,事件主题的创建者也可以充当发布者或者听众,在处理具体的情景这很常见。

Event 规范

Event 的事件委托采用 EventHandler,事件主题创建者、发布者、监听者都必须标明 Sender (ps:谁触发的事件) 和 EventArgs (ps:触发事件时传递的信息)。

Event 使用

  • GUI 模块扩展
  1. EventServer:这个是内部启动的MiniHttpServer,他将充当小型服务器并用于处理简单的HTTP协议,这样开发人员就可以自定义交互协议与框架程序进行通讯了(ps:未来将使用 websocket)。

  2. 事件主题面板:这个面板提供最基本的参数类型,开发者可以在程序发布后在面板触发一个调试事件(目前仅仅支持EventArgs.Empty和DebuggerEventArgs的类型)。

  3. 日志面板:记录事件主题的触发,并且会有触发平台的检测与提示。

EventGUI

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);
             }
    }
Clone this wiki locally