最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少。但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子、看小说,要么就是吃鸡,唉!真是罪过罪过。希望能从这篇博客开始有些改善吧,尽量少玩耍,还是多学习吧~
好了扯得有点远了,来说说我们今天博客的主题——“用C#和Lua实现Unity中的事件分发机制”,事件分发机制或者叫事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块。我们可以用它来解耦,监听网络消息,或者做一些异步的操作,好处多多(其实是别人的框架都有这个,所以我们的框架也必须有这玩意~)。今天马三就和大家一起,分别使用C#和Lua实现两种可以用在Unity游戏开发中的事件分发处理机制,希望能对大家有些帮助吧~
二、C#版的事件分发机制首先我们来实现C#版本的事件分发机制,目前这套流程已经集成到了马三自己的 ColaFrameWork框架 中了。这套框架还在架构阶段,里面很多东西都不完善,马三也是会随时把自己的一些想法放到里面,大家感兴趣的话也可以帮忙维护一下哈!
一般来说事件订阅、派发这种机制都是使用观察者模式来实现的,本篇博客也不例外,正是利用了这种思想。为了解耦和面向接口编程,我们制定了一个接口IEventHandler,凡是观察者都需要实现这个接口,而GameEventMgr事件中心维护了一个IEventHandler列表,保存着一系列的观察者,并在需要的时候进行一系列的动作。这样操作正是遵循了依赖倒置的设计原则:“高层模块不应该依赖于低层模块,两者都应该依赖于抽象概念;”、“抽象接口不应该依赖于实现,而实现应该依赖于抽象接口”。下面的代码定义了IEventHandler接口和一些委托还有事件传递时需要携带的参数。
1 using System.Collections; 2 using System.Collections.Generic; 3 using EventType = ColaFrame.EventType; 4 5 /// <summary> 6 /// 接收消息后触发的回调 7 /// </summary> 8 /// <param></param> 9 public delegate void MsgHandler(EventData data); 10 11 /// <summary> 12 /// 事件处理器的接口 13 /// </summary> 14 public interface IEventHandler 15 { 16 bool HandleMessage(GameEvent evt); 17 18 bool IsHasHandler(GameEvent evt); 19 } 20 21 /// <summary> 22 /// 事件消息传递的数据 23 /// </summary> 24 public class EventData 25 { 26 public string Cmd; 27 public List<object> ParaList; 28 } 29 30 /// <summary> 31 /// 游戏中的事件 32 /// </summary> 33 public class GameEvent 34 { 35 /// <summary> 36 /// 事件类型 37 /// </summary> 38 public EventType EventType { get; set; } 39 /// <summary> 40 /// 携带参数 41 /// </summary> 42 public object Para { get; set; } 43 } 44 45 46 namespace ColaFrame 47 { 48 /// <summary> 49 /// 事件的类型 50 /// </summary> 51 public enum EventType : byte 52 { 53 /// <summary> 54 /// 系统的消息 55 /// </summary> 56 SystemMsg = 0, 57 /// <summary> 58 /// 来自服务器推送的消息 59 /// </summary> 60 ServerMsg = 1, 61 /// <summary> 62 /// UI界面消息 63 /// </summary> 64 UIMsg = 2, 65 } 66 }