# EcsNode **Repository Path**: Noleggedbird/EcsNode ## Basic Information - **Project Name**: EcsNode - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-10 - **Last Updated**: 2025-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EcsNode 基于Entity-Component-System的框架 支持热重载 # 游戏高效编程范式理念 - 数据逻辑分离(Component-System) - 业务渲染分离(System-ViewSystem) - 组合优于继承(Entity-Component) - 领域驱动设计(EcsNode,领域可看做不同的业务场景,规划对齐需求粒度,降低协作理解成本) - 高内聚低耦合(高内聚优先于低耦合(模块化),浅传参优先于深传参(扁平化)) - 面向切面编程(避免侵入式编码) - 规范化模块开发流(AI+)(Spec-Modular-Driven,类似于Kiro的Spec-Driven,基于copilot-instruction.md) # AI+ 模块开发流程示例: - Modules.Unity/com.module.resource-data(资源模块) - Modules.Unity/com.module.achieve(达成模块,用于成就和任务等) - Modules.Unity/com.module.grid-based(网格系统) - Modules.Unity/com.module.building(建筑建造模块) - 常用prompt示例: - 补充完善require需求文档 - 根据新修改的require文档,调整修改design文档 - 根据新修改的design文档,调整修改program文档 - 根据新修改的program文档,调整修改program-test文档 - 根据新修改的program文档,调整修改配置接口、实体、组件、类型补充代码文件 - 根据新修改的program文档,调整修改配置接口代码文件 - 根据新修改的program文档,调整修改实体代码文件 - 根据新修改的program文档,调整修改组件代码文件 - 根据新修改的program文档,调整修改系统代码文件 - 根据新修改的program文档,调整修改model和system代码 - 根据program-test文档和模块System代码,调整修改单元测试代码文件 - 据version-iteration版本迭代文档中版本1.x.x的修改需求,依次调整修改require文档、design文档、program文档、program-test文档 copilot-instruction.md 里的都是自然语言描述的指导文档,亦可用于别的大模型指导文档,比如CLAUDE.md、cursor rule等 # SLG游戏demo(开发中) - Modules.Unity/com.module.resource-data(资源模块) - Modules.Unity/com.module.grid-based(网格系统) - Modules.Unity/com.module.building(建筑建造模块) - Modules.Unity/com.module.achieve(达成模块,用于成就和任务等) # 帧同步demo(开发中) 方案一:仅预测移动,冲突即重置回滚重新预测(已实现) 方案二:预测碰撞事件缓存,先做特效表现,等待权威帧验证,验证通过则继续走逻辑,验证不通过则碰撞事件丢弃(未实现) 方案三:全部预测,缓存状态帧快照用以回滚(未实现) - 帧同步demo,黄色物体是确定帧轨迹 ## 基于实体和组件的数据驱动 model entity ## 面向系统和过程的业务开发 system 1vN 数据分散(把数据分散到多个组件,降低运行时内存负担) 逻辑收束(将逻辑归纳总结为统一系统,降低开发者理解负担) 将定义和理解一致 强调系统的归属 与C#传统写法一致 框架里有两种事件机制,一种是模块间接交互事件,一种是System接口事件 间接交互事件用于间接调用,用于虽然能直接调用到但不应该直接调用的时候,属于间接解耦 System接口事件用于动态派发,用于不应该直接调用也调用不到的时候,属于弱解耦,比如业务层触发视图层逻辑的时候 完全解耦的事件机制,比如字符串事件,这种过于灵活,并不推荐使用,会增加代码的维护和理解成本 模块间接交互事件是显示调用的,非动态派发,用于同一层级的模块之间交互,比如业务层级模块之间的交互(比如FireEvent、CollisionEvent),视图层级模块之间的交互(比如InputEvent) System接口事件 框架通用System接口(比如IAwake、IDestroy),所有实体组件都适用,调用时无法明确接口参数,需要通过反射实现,需要注册(EcsNode.RegisterDrive) 业务指定System接口(比如IAfterRunEvent),适用于指定实体,调用时明确知道接口参数,可以直接通过接口调用,无需注册 ## 提升开发效率的核心在于降低测试的时间和成本,提升测试的效率 首先是核心玩法逻辑,每次改逻辑或者加日志都需要重开游戏就非常浪费时间 这个可以通过逻辑热重载降低测试成本 再一个就是UI开发,UI的需求变动非常频繁,每次改ui逻辑和界面都需要重开游戏非常浪费时间 这个可以结合FGUI和代码生成实现界面和代码热更新降低测试成本 ui框架不需要使用ecs,因为ui界面天生就有主次之分,不需要通过实体和组件来区分主次 比如window就是主,button、text、image等都是包含在window之内的组件,主次一目了然 ui框架直接基于面向对象来实现 只有业务功能框架,一般主次区分不明显,需要用到ecs的实体和组件来区分主次,方便理解 过程是逻辑的梳理和复用 # 参考 - https://github.com/egametang/ET - https://github.com/Leopotam/ecslite - https://github.com/vovgou/loxodon-framework - https://github.com/liyingsong99/FolderTag