Lazy loaded image
Unity Dots 实战
Words 1261Read Time 4 min
2025-7-26
2025-7-26
type
status
date
slug
summary
tags
category
icon
password
comment

开始使用ECS系统

首先要做的就是在场景中创键子场景,子场景的作用是放置实体
我们创键GameObject的方式依旧与之前一致,只不过我们将其作为子场景的子物体
在ECS中所有的组件都会被烘焙成实体组件,这个系统是智能的他会按需烘焙;烘焙是将组件烘焙成等效的DOTS组件;将组件的数据转化成为二进制的DOTS数据
notion image
右上角有一个小点,可以切换创作者模式(GameObject),和运行时模式(ECS)
当我们让子场景失活的时候,其下的子物体就为不可编辑的状态了,但是他仍然会显示,因为他已经被烘焙为二进制数据了。这样的好处是例如一个大的场景,我们可以快速的将其加载和卸载。
空物体在DOTS中是无法烘焙的,烘焙系统足够只能,不会浪费任何资源

实体中的对象是如何运行的

在子场景中 DOTS 物体会正常模拟物理运动
在运行游戏后,会发现Scene窗口与Game窗口不同步,下图所示,可以修改为同步
notion image

自定义组件

创键自定义DOTS组件

在右键菜单中直接创键IComponentData脚本即可,需要注意的是该脚本不再是类(class),而是结构体(struct
IComponentData的作用类似于标签,其内部没有封装任何方法,用于识别这是一个DOTS组件

挂载DOTS组件

创键一个MonoBehaviour脚本,将其命名为MoveSpeedAuthoring,我们在脚本后添加Authoring来指定这是我们将要烘焙自定义DOTS组件的脚本。
但目前为止MoveSpeedAuthoringMoveSpeed之间并没有关联,所以MoveSpeedAuthoring脚本并不会被烘焙。我们需要实现内部类Baker,并继承自Baker<T>,实现Baker函数,让DOTS组件和Mono脚本关联,让DOTS系统进行烘焙。
我们可以看到MoveSpeed组件成功的被烘焙
notion image

系统(System)

右键菜单新建System,System继承自ISystem;需要注意的时Unity中有SystemBaseISystem,他们的区别是前者是托管的(为类设计的)而后者是非托管的(为结构体设计的)

实体查询

使用 SystemAPI.Query 查询所有拥有组件的实体。
在DOTS系统中使用float3更加快速
在DOTS中我们不再使用Time.deltaTime,而是使用SystemAPI.Time.DeltaTime

额外内容

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

Comments
Loading...