ET介绍——事件机制EventSystem

打印 上一主题 下一主题

主题 525|帖子 525|积分 1575

事件机制EventSystem

ECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑。什么是数据驱动逻辑呢?不太好理解,我们举个例子 一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上方头像UI上显示。这时候服务端发来一个扣血消息。我们怎么处理这个消息?第一种方法,在消息处理函数中修改英雄的血数值,修改头像上血条显示,同时修改头像UI的血条。这种方式很明显造成了模块间的耦合。第二种方法,扣血消息处理函数中只是改变血值,血值的改变抛出一个hpchange的事件,人物头像模块跟UI模块都订阅血值改变事件,在订阅的方法中分别处理自己的逻辑,这样各个模块负责自己的逻辑,没有耦合。 ET提供了多种事件,事件都是可以多次订阅的:

  • AwakeSystem,组件工厂创建组件后抛出,只抛出一次,可以带参数
  1.     Player player = ComponentFactory.Create<Player>();
  2.     // 订阅Player的Awake事件
  3.     public class PlayerAwakeSystem: AwakeSystem<Player>
  4.     {
  5.         public override void Awake(Player self)
  6.         {
  7.         }
  8.     }
复制代码
 

  • StartSystem,组件UpdateSystem调用前抛出
  1.     // 订阅Player的Start事件
  2.     public class PlayerStartSystem: StartSystem<Player>
  3.     {
  4.         public override void Start(Player self)
  5.         {
  6.         }
  7.     }
复制代码
 

  • UpdateSystem,组件每帧抛出
  1.     // 订阅Player的Update事件
  2.     public class PlayerUpdateSystem: UpdateSystem<Player>
  3.     {
  4.         public override void Update(Player self)
  5.         {
  6.         }
  7.     }
复制代码
 

  • DestroySystem,组件删除时抛出
  1.     // 订阅Player的Destroy事件
  2.     public class PlayerDestroySystem: DestroySystem<Player>
  3.     {
  4.         public override void Destroy(Player self)
  5.         {
  6.         }
  7.     }
  8.     Player player = ComponentFactory.Create<Player>();
  9.     // 这里会触发Destroy事件
  10.     player.Dispose();
复制代码
 

  • ChangeSystem,组件内容改变时抛出,需要开发者手动触发
  1.     // 订阅Player的Destroy事件
  2.     public class PlayerChangeSystem: ChangeSystem<Player>
  3.     {
  4.         public override void Change(Player self)
  5.         {
  6.         }
  7.     }
  8.     Player player = ComponentFactory.Create<Player>();
  9.     // 需要手动触发ChangeSystem
  10.     Game.EventSystem.Change(player);
复制代码
 

  • DeserializeSystem,组件反序列化之后抛出
  1.     // 订阅Player的Deserialize事件
  2.     public class PlayerDeserializeSystem: DeserializeSystem<Player>
  3.     {
  4.         public override void Deserialize(Player self)
  5.         {
  6.         }
  7.     }
  8.     // 这里player2会触发Deserialize事件
  9.     Player player2 = MongoHelper.FromBson<Player>(player.ToBson());
复制代码
 

  • LoadSystem,EventSystem加载dll时抛出,用于服务端热更新,重新加载dll做一些处理,比如重新注册handler
  1.     // 订阅Player的Load事件
  2.     public class PlayerLoadSystem: LoadSystem<Player>
  3.     {
  4.         public override void Load(Player self)
  5.         {
  6.         }
  7.     }
复制代码
 

  • 普通的Event,由开发者自己抛出,可以最多带三个参数。另外客户端热更层也可以订阅mono层的Event事件
  1.     int oldhp = 10;
  2.     int newhp = 5;
  3.     // 抛出hp改变事件
  4.     Game.EventSystem.Run("HpChange", oldhp, newhp);
  5.     // UI订阅hp改变事件
  6.     [Event("HpChange")]
  7.     public class HpChange_ShowUI: AEvent<int, int>
  8.     {
  9.         public override void Run(int a, int b)
  10.         {
  11.             throw new NotImplementedException();
  12.         }
  13.     }
  14.     // 模型头顶血条模块也订阅hp改变事件
  15.     [Event("HpChange")]
  16.     public class HpChange_ModelHeadChange: AEvent<int, int>
  17.     {
  18.         public override void Run(int a, int b)
  19.         {
  20.             throw new NotImplementedException();
  21.         }
  22.     }
复制代码
 

  • 除此之外还有很多事件,例如消息事件。消息事件使用MessageHandler来声明,可以带参数指定哪种服务器需要订阅。
  1.     [MessageHandler(AppType.Gate)]
  2.     public class C2G_LoginGateHandler : AMRpcHandler<C2G_LoginGate, G2C_LoginGate>
  3.     {
  4.         protected override void Run(Session session, C2G_LoginGate message, Action<G2C_LoginGate> reply)
  5.         {
  6.             G2C_LoginGate response = new G2C_LoginGate();
  7.             reply(response);
  8.         }
  9.     }
复制代码
 
更具体的消息事件等到讲消息的时候再细细讲解了
10. 数值事件,数值模块再讲解
......, 更多的事件由自己去开发。
ET框架的逻辑就是由以上各种事件来驱动的。
ET开源地址地址:egametang/ET: Unity3D Client And C# Server Framework (github.com)   qq群:474643097

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表