type
status
date
slug
summary
tags
category
icon
password
comment
开始使用ECS系统
首先要做的就是在场景中创键子场景,子场景的作用是放置实体
我们创键GameObject的方式依旧与之前一致,只不过我们将其作为子场景的子物体
在ECS中所有的组件都会被烘焙成实体组件,这个系统是智能的他会按需烘焙;烘焙是将组件烘焙成等效的DOTS组件;将组件的数据转化成为二进制的DOTS数据

右上角有一个小点,可以切换创作者模式(GameObject),和运行时模式(ECS)
当我们让子场景失活的时候,其下的子物体就为不可编辑的状态了,但是他仍然会显示,因为他已经被烘焙为二进制数据了。这样的好处是例如一个大的场景,我们可以快速的将其加载和卸载。
空物体在DOTS中是无法烘焙的,烘焙系统足够只能,不会浪费任何资源
实体中的对象是如何运行的
在子场景中 DOTS 物体会正常模拟物理运动
在运行游戏后,会发现Scene窗口与Game窗口不同步,下图所示,可以修改为同步

自定义组件
创键自定义DOTS组件
在右键菜单中直接创键
IComponentData脚本即可,需要注意的是该脚本不再是类(class),而是结构体(struct)IComponentData的作用类似于标签,其内部没有封装任何方法,用于识别这是一个DOTS组件挂载DOTS组件
创键一个
MonoBehaviour脚本,将其命名为MoveSpeedAuthoring,我们在脚本后添加Authoring来指定这是我们将要烘焙自定义DOTS组件的脚本。但目前为止
MoveSpeedAuthoring和MoveSpeed之间并没有关联,所以MoveSpeedAuthoring脚本并不会被烘焙。我们需要实现内部类Baker,并继承自Baker<T>,实现Baker函数,让DOTS组件和Mono脚本关联,让DOTS系统进行烘焙。我们可以看到MoveSpeed组件成功的被烘焙

系统(System)
右键菜单新建
System,System继承自ISystem;需要注意的时Unity中有SystemBase和ISystem,他们的区别是前者是托管的(为类设计的)而后者是非托管的(为结构体设计的)实体查询
使用 SystemAPI.Query 查询所有拥有组件的实体。
在DOTS系统中使用
float3更加快速在DOTS中我们不再使用
Time.deltaTime,而是使用SystemAPI.Time.DeltaTime额外内容

这里我们使用空物体左右角色的父物体时,我们需要注意的是空物体依然不会被烘焙
TransformUsageFlags 参数总览参数名 | 是否添加Transform组件 | 描述用途 | 适用场景举例 |
None | ❌ 否 | 不使用 Transform 系统。不生成任何与 Transform 相关的组件 | 纯数据实体,不参与位置、旋转、缩放等 |
Renderable | ✅ 是 | 添加最小的 Transform 数据,仅用于渲染。添加 LocalToWorld 组件 | 静态可渲染物体,位置不变 |
Dynamic | ✅ 是 | 完整的 Transform 控制,添加如 LocalTransform、LocalToWorld、Parent 等 | 可移动/旋转的对象,如玩家、敌人 |
WorldSpace | ✅ 是 | 只使用 LocalToWorld,用于设置世界空间位置,不含层级关系和局部变换 | 摄像机、UI锚点、特效锚点等 |
ManualOverride (不常用) | ❌ 否(或手动) | 表示用户将手动设置 Transform 的同步,不使用默认系统 | 特殊控制需求,如自定义同步逻辑 |
系统窗口

系统窗口有我们所有的系统,我们可以查看系统控制的实体数量
- Author:qqssdda
- URL:blog.sadaharu.top/article/23cd0a21-aa6d-8033-8609-cdcf608ab823
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!



