上海建设企业网站,贸易公司自建免费网站,wordpress 电话登记插件,长春专业网站制作公司参考文章#xff1a;浅谈Unity ECS#xff08;一#xff09;Uniy ECS基础概念介绍#xff1a;面向未来的ECS - 知乎 (zhihu.com)
视频链接#xff1a;【青幻译制】GDC讲座系列之三 守望先锋的游戏架构和网络代码_哔哩哔哩_bilibili
云风的 BLOG: 浅谈《守望先锋》中的 E…参考文章浅谈Unity ECS一Uniy ECS基础概念介绍面向未来的ECS - 知乎 (zhihu.com)
视频链接【青幻译制】GDC讲座系列之三 守望先锋的游戏架构和网络代码_哔哩哔哩_bilibili
云风的 BLOG: 浅谈《守望先锋》中的 ECS 构架 (codingnow.com)
游戏开发中的ECS架构-CSDN博客 一个典型的 ECS 框架 ↑
世界-是系统和实体的组合 - 实体是一个组件的集合所对应的ID组件仅仅用于储存游戏状态而不具备行为系统具有行为却不保存游戏状态
组件没有函数系统没有成员变量 Entity Component System (ECS) 是一个 gameplay 层面的框架它是建立在渲染引擎、物理引擎之上的主要解决的问题是如何建立一个模型来处理游戏对象 (Game Object) 的更新操作。 这边最主要区别就是把对象上的数据和行为剥离由专门的System来处理某一种行为而不是每个对象在自己的一个更新函数中处理所有和自己相关的操作
Unity ECS基本概念
Entity的概念
它的意义在于生命期管理这里是用 32bit ID 而不是指针来表示的另外附着了渲染用到的资源 ID 。因为仅负责生命期管理而不设计调用其上的方法用整数 ID 更健壮。整数 ID 更容易指代一个无效的对象而指针就很难做到。
Entity为ECS中基本的成员实际上只是由一个Index和一个Version组成(Version只有在Entity被回收后会加1)其实际的Component数据存储在一个Chunk上(Unity ECS特有的数据类型)需要操作其Component数据时根据其index到EntityDataManager中找到其所在的Chunk和IndexInChunk取到对应的Component数据后进行操作。
public struct Entity : IEquatableEntity{public int Index;public int Version;...... }
Component的概念
component是Entity的一个属性通常记成了IComponent 或 ISharedComponentData 接口的结构体两个接口都为空接口仅标记了类型。一个 Entity 可以包含多个 Component 记成了 ISharedComponentData 的数据会在多个 Entity 中共享同时可以使用托管类型的成员一般用来存放 GameObject 或 RenderMesh 等渲染相关的成员
一个Entity的Component可以在CreateEntity时指定也可以使用一个ArcheType创建或从已有Entity复制来创建。同时已经创建的Entity还可以通过AddComponent和RemoveComponent来动态进行Component的添加或删除(由于效率问题不推荐)。
Tips:Component可以用Proxy包装后直接挂在GameObject上挂载多个Proxy的GameObject可以作为Prefab直接传入EntityManager.Instantiate来生成新的Entity如
// Create an entity from the prefab set on the spawner component.var prefab spawnerData.prefab;var entity EntityManager.Instantiate(prefab);
ArcheType的概念
ArcheType 是Unity ECS 中特有的概念也是 Unity ECS 内存管理中的一个核心部分许多重要操作都与此相关。ArcheType 是由几个固定 Component 组成的 Entity 原型
ArcheType管理所有属于它的Entity Component数据对应数据存放在归属于它的chunk上可以通过ArcheType快速访问所有该类型的Entity Component数据拥有Component的Entity一定处在某个ArcheType的管理之下ArcheType拥有缓存机制第二次创建相同的ArcheType时会自动将现有的返回
我们可以使用EntityManager.CreateArchetype(params ComponentType[] types)来主动创建一个ArcheType通过ArcheType可以直接调用EntityManager.CreateEntity(EntityArchetype archetype)来快速创建具有某一类特征的Entity。同时如果使用直接传入Components的方式来创建Entity时也会自动生成含有对应Component的ArcheType。
ComponentSystem的概念
ComponentSystem 为 System 在 Unity ECS 中的实现一个 ComponentSystem 会对含有某些 Component 的 Entity 执行一些特定的操作通常继承自 ComponentSystem 或 JobComponentSystem。区别是继承 ComponentSystem 只会在主线程执行而继承自 JobComponentSystem 则可以利用 JobSystem 来进行多线程并发处理但同时对应操作过程中的限制也更严格。在大部分情况下应当尽量使用 JobComponentSystem 来完成相关的操作从而提升性能
多个不同的 ComponentSystem 可以在定义时通过 UpdateBefore UpdateAfterUpdateBefored 等标签来控制其执行顺序这会在一定程度上影响并发执行通常只在必要时使用
一个 ComponentSystem 通常关注一个包含特定的 Component 组合的 Entity 集合称为 Component Group这个 ComponentGroup 集合可以通过 GetComponentGroup 主动获取
ComponentGroup m_Spawners;
//获取包含ObjectSpawner和Position两个Component的ComponentGroup
protected override void OnCreateManager()
{m_Spawners GetComponentGroup(typeof(ObjectSpawner), typeof(Position));
}