ET8.1-ECS组件式编程

一、目录结构

hotfix \ hotfixView 是热更新相关 主要实现系统方法

model \ modelView 是实体 主要实现数据组件

hotfix \ model 是数据层 不能引用Unity相关类库

hotfixView \ modelView 是表现层 可以引用Unity相关类库

client 用于编写客户端的程序

server 用于编写服务器端的程序

share 是共同用于服务器端与客户端的程序

表现层和逻辑层的关系?什么叫表现层可以调用逻辑层,逻辑层抛出事件给表现层监听?

逻辑层:Hotfix:游戏逻辑、数据计算、网络通信、服务端共用、不依赖Unity

表现层:HotfixView:UI显示、模型渲染、动画播放、音效播放、特效播放

表现层->逻辑层 直接调用 LoginHelper.Login()

逻辑层->表现层 发布事件 Publish(new LoginFinish())

这样设计的好处:

  1. 解耦 - 逻辑层不依赖表现层
  2. 复用 - 同一逻辑层可以配不同的表现层
  3. 服务端友好 - 服务端只有逻辑层,没有表现层

二、ECS组件式编程

ET框架的设计原则:树状领域、组合模式、事件驱动、逻辑分发

组合优于继承的原则

E:Entity 实体 :容器; C:Component 组件: 具体数据;S:System 系统 : 具体方法

实体即组件,组件即实体:

csharp 复制代码
//Component 位于 Model层 (实体、数据层)
[ComponentOf(typeof(Hero))]  //(父组件下仅一个该子组件时,可以用ChirdOf)( 表示这个组件只能挂在 Unit 上面)
public class ArmComponent: Entity, IAwake<long>, IDestroy
{
	//只定义数据,没有逻辑
}
csharp 复制代码
//System 位于Hotfix层 (方法、热更新、数据层)
[EntitySystemOf(typeof(ArmComponent))]
public static partial class ArmComponentSystem  // 源代码生成器中自动生成了一个同名类
{
        [EntitySystem]
        private static void Awake(this ET.ArmComponent self)
        {
            Log.Debug("已创建");
        }
        // 抬手
      public static async ETTask<bool> RaiseArmAsync(this ArmComponent self,bool ifRaiseArm)
      {
          self.IfRaiseArm = ifRaiseArm;
          //缓慢抬手逻辑
          await root.GetComponent<TimerComponent>().WaitAsync(100);
      }
      
       // 是否抬起
      public static bool IsRaise(this ArmComponent self)
      {
          return self.IfArmRaiseUpTargerHigh;
      }
 
         [EntitySystem]
        private static void Destroy(this ET.ArmComponent self)
        {
            Log.Debug("已销毁");
        }
}

怎么使用?

csharp 复制代码
//创建一个
Hero hero= scene.AddChild<Hero>();
//添加胳膊组件
ArmComponent arm = hero.AddComponent<ArmComponent>();
//使用System方法
await arm.RaiseArmAsync(true);
if (arm.IsRaise())
{  Log.Debug("抬起成功");}

Scripts/

├── Model/ # 数据层 (不热更)

│ └── ArmComponent.cs # 只有数据定义

│

└── Hotfix/ # 逻辑层 (可热更)

└── ArmComponentSystem.cs # 所有逻辑方法

备注:

**扩展函数:**就是代码里的this,给别人写好的类,偷偷加新方法

扩展函数规则:1.必须是静态方法;2. 第一个参数必须加this;3. 必须放在静态类里

因为Component里只存数据,不能写方法,所以方法都要写在外面

相关推荐
前进的李工21 分钟前
Agent 学习笔记 02:Harness 与工作流怎么理解
笔记·学习·agent·工作流·harness
m4Rk_1 小时前
【论文阅读】Agent记忆机制(114):MemoryTax——当 Agent 能自主搜索历史,专门的记忆系统还划算吗?
论文阅读·人工智能·学习·开源·github
海鸥-w2 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle
滴啦嘟啦哒2 小时前
【具身笔记】【原理探究】一、对PI05源码的实践笔记
笔记·python·vla·具身
程序员梅雨3 小时前
【从零开始学习数据仓库 | 第一篇】:维度建模理论
大数据·数据仓库·学习·阿里云·数据分析
keyipatience4 小时前
Git学习(4)Git分布式优势与实战配置全解析
git·学习
览讯冷却4 小时前
冷却塔噪声的健康危害与法规要求的技术梳理
经验分享·笔记·科技·其他·百度·制造·业界资讯
Dory_Youth4 小时前
电脑的搜索功能不能用,一搜就黑屏闪退
运维·笔记
bessyon5 小时前
信息熵减与医疗交付:以3D检测与设备溯源为例
笔记
comyccccc7 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习