ET介绍——事件机制EventSystem
1.ET介绍——强大的基于.dotnet7+Unity3d的双端C#开源游戏框架2.ET介绍——为什么使用C# .net core做服务端?3.ET介绍——CSharp协程4.ET介绍——C#更好的协程5.ET介绍——单线程异步6.ET介绍——强大的MongoBson库7.ET介绍—— 一切皆实体的设计
8.ET介绍——事件机制EventSystem
9.ET介绍——组件式设计(优化版的ECS)10.ET介绍——分布式Actor模型11.ET介绍——Actor Location12.ET介绍——数值组件设计13.ET介绍——浅谈AI框架14.ET介绍——更为便捷高效的AI框架-行为机(Behavior Machine)15.ET8开发微信小游戏之部署云服务器Nginx代理16.浅谈ET框架--ECS设计核心(一)17.Dotnet core Console调用WIndows.Forms的MessageBox提示事件机制EventSystem
ECS最重要的特性一是数据跟逻辑分离,二是数据驱动逻辑。什么是数据驱动逻辑呢?不太好理解,我们举个例子 一个moba游戏,英雄都有血条,血条会在人物头上显示,也会在左上方头像UI上显示。这时候服务端发来一个扣血消息。我们怎么处理这个消息?第一种方法,在消息处理函数中修改英雄的血数值,修改头像上血条显示,同时修改头像UI的血条。这种方式很明显造成了模块间的耦合。第二种方法,扣血消息处理函数中只是改变血值,血值的改变抛出一个hpchange的事件,人物头像模块跟UI模块都订阅血值改变事件,在订阅的方法中分别处理自己的逻辑,这样各个模块负责自己的逻辑,没有耦合。 ET提供了多种事件,事件都是可以多次订阅的:
- AwakeSystem,组件工厂创建组件后抛出,只抛出一次,可以带参数
Player player = ComponentFactory.Create<Player>(); // 订阅Player的Awake事件 public class PlayerAwakeSystem: AwakeSystem<Player> { public override void Awake(Player self) { } }
- StartSystem,组件UpdateSystem调用前抛出
// 订阅Player的Start事件 public class PlayerStartSystem: StartSystem<Player> { public override void Start(Player self) { } }
- UpdateSystem,组件每帧抛出
// 订阅Player的Update事件 public class PlayerUpdateSystem: UpdateSystem<Player> { public override void Update(Player self) { } }
- DestroySystem,组件删除时抛出
// 订阅Player的Destroy事件 public class PlayerDestroySystem: DestroySystem<Player> { public override void Destroy(Player self) { } } Player player = ComponentFactory.Create<Player>(); // 这里会触发Destroy事件 player.Dispose();
- ChangeSystem,组件内容改变时抛出,需要开发者手动触发
// 订阅Player的Destroy事件 public class PlayerChangeSystem: ChangeSystem<Player> { public override void Change(Player self) { } } Player player = ComponentFactory.Create<Player>(); // 需要手动触发ChangeSystem Game.EventSystem.Change(player);
- DeserializeSystem,组件反序列化之后抛出
// 订阅Player的Deserialize事件 public class PlayerDeserializeSystem: DeserializeSystem<Player> { public override void Deserialize(Player self) { } } // 这里player2会触发Deserialize事件 Player player2 = MongoHelper.FromBson<Player>(player.ToBson());
- LoadSystem,EventSystem加载dll时抛出,用于服务端热更新,重新加载dll做一些处理,比如重新注册handler
// 订阅Player的Load事件 public class PlayerLoadSystem: LoadSystem<Player> { public override void Load(Player self) { } }
- 普通的Event,由开发者自己抛出,可以最多带三个参数。另外客户端热更层也可以订阅mono层的Event事件
int oldhp = 10; int newhp = 5; // 抛出hp改变事件 Game.EventSystem.Run("HpChange", oldhp, newhp); // UI订阅hp改变事件 [Event("HpChange")] public class HpChange_ShowUI: AEvent<int, int> { public override void Run(int a, int b) { throw new NotImplementedException(); } } // 模型头顶血条模块也订阅hp改变事件 [Event("HpChange")] public class HpChange_ModelHeadChange: AEvent<int, int> { public override void Run(int a, int b) { throw new NotImplementedException(); } }
- 除此之外还有很多事件,例如消息事件。消息事件使用MessageHandler来声明,可以带参数指定哪种服务器需要订阅。
[MessageHandler(AppType.Gate)] public class C2G_LoginGateHandler : AMRpcHandler<C2G_LoginGate, G2C_LoginGate> { protected override void Run(Session session, C2G_LoginGate message, Action<G2C_LoginGate> reply) { G2C_LoginGate response = new G2C_LoginGate(); reply(response); } }
更具体的消息事件等到讲消息的时候再细细讲解了
10. 数值事件,数值模块再讲解
......, 更多的事件由自己去开发。
ET框架的逻辑就是由以上各种事件来驱动的。
ET开源地址地址:egametang/ET: Unity3D Client And C# Server Framework (github.com) qq群:474643097
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?