简单来讲,ECS就是面向数据的编程方法.
把原来一个gameobject物体对象身上的类,脚本中的逻辑和数据,
拆分成了纯数据.和纯逻辑处理脚本2部分.
需要点开,显示预览的包.使用Unity的安装以下的包.
Burst——注意安装的版本.
Entities
Hybrid Renderer
Jobs
Mathematics
Collections——可选。
是否可以直接安装DOTS Editor这个包?
Ecs啥时用?
大量差不多的物体,操作,比如怪海啥的.通常文字类游戏,可能用到的情况很少.
大量粒子的情况.总之需要内存连续读取的.或者性能提升的地方.
Sub场景物体---Ecs组件的父级物体.内部的树形结构就是一个个的实体了.
实体上,可以有各种组件Component,和普通的GameObject上的操作一样,
但其运行时会被bake成为更加细分的ecs组件.

Sub场景物体

baking后生成的更细的组件.
基本上就3个部分.
数据部分---简单写一个结构体struct,并继承IComponentData,
逻辑部分---继承Isystem就行了,类似一个存在于目录里面的静态类,直接运行.无需放到场景中.处理物体计算逻辑.
转换数据器---Baker.怎么把当前数据转化成Ecs版本的方法,如果是纯数据计算类,无需挂载到游戏场景中,进行计算的.比如.伤害计算、AI 决策、缓冲区实体,子弹(实时生成的)

✅ 不依赖 GameObject / MonoBehaviour✅ 仅用于内部计算(如伤害、AI、经济)✅ 动态生成(如子弹、粒子、事件)✅ 无需 Inspector 编辑(运行时计算)
战斗系统(伤害计算、Buff/Debuff)
AI 决策(状态机、寻路)
经济系统(资源管理、交易)
物理模拟(自定义碰撞、抛射物)
事件系统(死亡、任务完成)
// ✅ 纯 ECS 组件(无 MonoBehaviour 依赖)
public struct HealthComponent : IComponentData { ... }
// ✅ 动态创建(无需 Baker)
EntityManager.CreateEntity(typeof(HealthComponent));
// ❌ 不需要这样(除非你要转换 GameObject)
public class HealthAuthoring : MonoBehaviour { ... }
public class HealthBaker : Baker<HealthAuthoring> { ... } 如果你的数据 只用于计算,不依赖场景 GameObject,那就 完全不需要 Baker,直接用 + 管理即可!这样性能更高,🎯更符合 ECS 的设计哲学。
菜单栏 → Window → Analysis → Entity Debugger
用于查看场景中创建了的,Ecs实体.的小工具.
注意.Baker是当你的实例,需要在场景中显示时候才用得到.
Baker用于 转换 GameObject 或 MonoBehaviour 数据到 ECS。
一个简单的,Baker写法.把数据转化成EcsSystem的形式.

一个简单的ECS范例
using Unity.Entities;
//✅逻辑部分
public partial struct LevelUpSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
foreach (var levelComponent in
SystemAPI.Query<RefRW<LevelComponent>>())
{
levelComponent.ValueRW.Level += 1f * SystemAPI.Time.DeltaTime;
}
}
}
//✅数据部分.
public struct LevelComponent : IComponentData
{
public float Level;
} 与Job系统简单例子.
附录:一个简单的JobSysystem的范例
using Unity.Entities;
using Unity.Jobs;
public class MyCustomSystem : ComponentSystem
{
//✅ 这个方法可以在任何地方被手动调用
public JobHandle MyCustomJobMethod()
{
// 创建Job
var job = new MyCustomJob
{
// 初始化Job数据
// 例如:job.deltaTime = Time.DeltaTime;
};
// 调度Job
JobHandle jobHandle = job.Schedule();
// 返回JobHandle以便可以在需要时等待Job完成
return jobHandle;
}
// 定义一个简单的Job
public struct MyCustomJob : IJob
{
// Job的执行逻辑
public void Execute()
{
// 在这里编写Job需要执行的代码
}
}
}
//✅ 使用示例
public class SomeOtherClass
{
private MyCustomSystem myCustomSystem;
public SomeOtherClass(MyCustomSystem system)
{
myCustomSystem = system;
}
public void SomeMethod()
{
// 手动调用MyCustomJobMethod
JobHandle jobHandle = myCustomSystem.MyCustomJobMethod();
// 在需要的时候等待Job完成
jobHandle.Complete();
// Job完成后可以进行其他操作
// 例如:处理Job的结果
}
}