【Unity】极简Ecs系统安装与使用手册
有机紫菜
2025年04月29日 16:05

Ecs是什么?

简单来讲,ECS就是面向数据的编程方法.

把原来一个gameobject物体对象身上的类,脚本中的逻辑和数据,

拆分成了纯数据.和纯逻辑处理脚本2部分.

Ecs的安装

需要点开,显示预览的包.使用Unity的安装以下的包.

  • Burst——注意安装的版本.

  • Entities

  • Hybrid Renderer

  • Jobs

  • Mathematics

  • Collections——可选。

  • 是否可以直接安装DOTS Editor这个包?

Ecs啥时用?

大量差不多的物体,操作,比如怪海啥的.通常文字类游戏,可能用到的情况很少.

大量粒子的情况.总之需要内存连续读取的.或者性能提升的地方.

Ecs在编辑器中的样子.

Sub场景物体---Ecs组件的父级物体.内部的树形结构就是一个个的实体了.

实体上,可以有各种组件Component,和普通的GameObject上的操作一样,

但其运行时会被bake成为更加细分的ecs组件.

Sub场景物体

baking后生成的更细的组件.

Ecs的脚本怎么写.

基本上就3个部分.

  • 数据部分---简单写一个结构体struct,并继承IComponentData,

  • 逻辑部分---继承Isystem就行了,类似一个存在于目录里面的静态类,直接运行.无需放到场景中.处理物体计算逻辑.

  • 转换数据器---Baker.怎么把当前数据转化成Ecs版本的方法,如果是纯数据计算类,无需挂载到游戏场景中,进行计算的.比如.伤害计算、AI 决策、缓冲区实体,子弹(实时生成的)

🚀 总结:哪些数据适合纯 ECS(不需要 Baker)?

不依赖 GameObject / MonoBehaviour仅用于内部计算(如伤害、AI、经济)动态生成(如子弹、粒子、事件)无需 Inspector 编辑(运行时计算)

典型应用场景

  1. 战斗系统(伤害计算、Buff/Debuff)

  2. AI 决策(状态机、寻路)

  3. 经济系统(资源管理、交易)

  4. 物理模拟(自定义碰撞、抛射物)

  5. 事件系统(死亡、任务完成)

代码块
C#
自动换行
复制代码
// ✅ 纯 ECS 组件(无 MonoBehaviour 依赖)
public struct HealthComponent : IComponentData { ... }

// ✅ 动态创建(无需 Baker)
EntityManager.CreateEntity(typeof(HealthComponent));

// ❌ 不需要这样(除非你要转换 GameObject)
public class HealthAuthoring : MonoBehaviour { ... }
public class HealthBaker : Baker<HealthAuthoring> { ... }
复制成功

结论

如果你的数据 只用于计算,不依赖场景 GameObject,那就 完全不需要 Baker,直接用 + 管理即可!这样性能更高,🎯更符合 ECS 的设计哲学。 

关于EntityManager

  • 菜单栏 → Window → Analysis → Entity Debugger

  • 用于查看场景中创建了的,Ecs实体.的小工具.

注意.Baker是当你的实例,需要在场景中显示时候才用得到.

Baker用于 转换 GameObject 或 MonoBehaviour 数据到 ECS

一个简单的,Baker写法.把数据转化成EcsSystem的形式.

一个简单的ECS范例

代码块
C#
自动换行
复制代码
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的范例

代码块
C#
自动换行
复制代码
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的结果
    }
}

复制成功