栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 游戏开发 > 其他

Unity+ECS框架(Entity Component System)学习(图文详细+源码)(一)——概念

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity+ECS框架(Entity Component System)学习(图文详细+源码)(一)——概念

Unity+ECS框架(Entity Component System)学习(图文详细+源码)(一)——概念
  • 官方链接
  • 一、ECS介绍
    • Entity(实体)
    • Component(组件)
    • System(系统)
      • 实例化系统
      • 实例化系统
  • 二、ECS概念
    • EntityArchetype(原型)
    • ArchetypeChunk(内存块)
    • EntityQuery(实体查询)
  • 总结
  • 版权声明


官方链接

还是老样子,上来先贴出官方的权威链接,有需要的可以去看下,然后我再来记录下自己的整个学习流程。Unity官方ECS链接


一、ECS介绍

ECS的全称是Entity Component System,翻译过来就是 实体组件系统,主要由3个部分组成,Entity(实体), Component(组件), System(系统),之前我接触的都是面向对象的编程,而ECS是面向数据的编程。

Entity(实体)

官方的解释:
实体是实体组件系统架构的三个主要元素之一。它们代表您的游戏或应用程序中的单个“事物”。实体既没有行为也没有数据;相反,它标识哪些数据属于一起。系统提供行为,组件存储数据。实体本质上是一个 ID。最简单的方法是将其视为一个轻量级的GameObject,默认情况下甚至没有名称。实体 ID 稳定;您可以使用它们来存储对另一个组件或实体的引用。例如,层次结构中的子实体可能需要引用其父实体。
尽管实体没有类型,但实体组可以根据与它们关联的数据组件的类型进行分类。当您创建实体并向其中添加组件时,EntityManager 会跟踪现有实体上组件的唯一组合。这种独特的组合称为Archetype(原型)。当您向实体添加组件时,EntityManager 会创建一个EntityArchetype结构。您可以使用现有的EntityArchetypes 创建符合该原型的新实体。您还可以EntityArchetype预先创建一个并使用它来创建实体。
我自己的理解:
就把他看成一个什么组件也没有的GameObject,你如果在unity中创建一个空GameObject,它还会有名字,位置,角度什么的信息,Entity就可以看成是这些所有的信息都没有的GameObject。

Component(组件)

官方的解释:
组件是实体组件系统架构的三个主要元素之一。它们代表您的游戏或应用程序的数据。实体是索引您的组件集合的标识符,而 [系统] 提供行为。
ECS 中的组件是具有以下“标记接口”之一的结构:

IComponentData — 用于通用和 [块组件]。
IBufferElementData — 将 [动态缓冲区] 与实体相关联。
ISharedComponentData — 按原型内的值对实体进行分类或分组。有关详细信息,请参阅 [共享组件数据]。
Hybrid Components— 一种将 UnityEngine 组件添加到实体的方法。
ISystemStateComponentData — 将特定于系统的状态与实体相关联,并检测何时创建或销毁单个实体。有关详细信息,请参阅系统状态组件。
ISharedSystemStateComponentData — 共享和系统状态数据的组合。请参阅系统状态组件。
Blob assets——虽然技术上不是“组件”,但您可以使用 Blob 资产来存储数据。Blob 资产可以被一个或多个组件使用BlobAssetReference 引用并且是不可变的。您可以使用 Blob 资产在资产之间共享数据并在 C# 作业中访问该数据。
我自己的理解:
感觉也可以把它理解成类似于unity自己的Component,主要是用来存储数据的,这个Component可以自己来定义,到底放什么数据,一个Entity上可以放多个Component,不同的Component可以有不同的组合,这个组合被叫做Archetype(原型),具有相同Archetype(原型)的Entity会被存储在同一个Chunk(块)里面,反过来说,就是在同一个Chunk(块)里面的Entity(实体)是肯定有相同的Component(组件)的。
下面是官方给的图例

System(系统)

官方的解释:
提供了从其当前状态的分量数据变换到其下一个状态的逻辑-例如,一个系统可能更新所有移动实体可以通过速度自上次更新乘以所述时间间隔的位置.

实例化系统

Unity ECS 会自动发现项目中的系统类并在运行时实例化它们。它将每个发现的系统添加到默认系统组之一。您可以使用系统属性来指定系统的父组以及该系统在组内的顺序。如果您不指定父级,Unity 会以确定性但未指定的顺序将系统添加到默认世界的模拟系统组。您还可以使用属性来禁用自动创建。

系统的更新循环由其父ComponentSystemGroup驱动。ComponentSystemGroup 本身是一种专门的系统,负责更新其子系统。组可以嵌套。系统从它们运行的世界中获取它们的时间数据;时间由UpdateWorldTimeSystem更新。

您可以使用实体调试器窗口(菜单:窗口>分析>实体调试器)查看系统配置。

实例化系统

Unity ECS 提供了多种类型的系统。通常,您编写的用于实现游戏行为和数据转换的系统将扩展SystemBase。其他系统类有专门的用途。您通常使用EntityCommandBufferSystem和ComponentSystemGroup类的现有实例。

SystemBase——创建系统时要实现的基类。
EntityCommandBufferSystem——为其他系统提供EntityCommandBuffer实例。每个默认系统组在其子系统列表的开头和结尾处维护一个实体命令缓冲区系统。这允许您对结构更改进行分组,以便它们在帧中产生较少的同步点。
ComponentSystemGroup——为其他系统提供嵌套组织和更新顺序。Unity ECS 默认创建多个组件系统组。
GameObjectConversionSystem – 将游戏的基于游戏对象的编辑器内表示转换为高效的、基于实体的运行时表示。游戏转换系统在 Unity 编辑器中运行。

我自己的理解:

System来处理含有某些特定Component的Entity的某一类行为,比如让所有含有位置组件的实体去旋转,旋转这个功能就需要在系统里面去写。

二、ECS概念
实体组件系统 (ECS) 架构将身份(实体)、数据(组件)和行为(系统)分开。该架构专注于数据。系统读取组件数据流,然后将数据从输入状态转换为输出状态,然后实体对其进行索引。所以之前说他是面向数据的编程。![请添加图片描述](https://img-blog.csdnimg.cn/3ae7ee4378e848f686e5413b2714e8fc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rC05YWJ5ra15pyI,size_19,color_FFFFFF,t_70,g_se,x_16) 上图是他们三者之间的关系,在此图中,系统读取Translation和Rotation组件,将它们相乘,然后更新相应的LocalToWorld组件 ( L2W = T*R)。 实体 A 和 B 有一个Renderer组件而实体 C 没有,这一事实不会影响系统,因为系统不关心Renderer组件。 您可以设置一个系统,使其需要一个Renderer组件,在这种情况下,系统将忽略实体 C 的组件;或者,您可以设置一个系统来排除具有Renderer组件的实体,然后忽略实体 A 和 B 的组件。 下面是介绍ECS里面的几个概念: EntityArchetype(原型)

就上上面说过的,组件类型的独特组合称为EntityArchetype。例如,一个 3D 对象可能有一个用于其世界变换的组件,一个用于线性运动,一个用于旋转,一个用于其视觉表示。这些 3D 对象之一的每个实例都对应于单个实体,但由于它们共享相同的组件集,因此 ECS 将它们分类为单个原型:


在此图中,实体 A 和 B 共享原型 M,而实体 C 具有原型 N。

要顺利更改实体的原型,您可以在运行时添加或删除组件。例如,如果您Renderer从实体 B 中移除组件,则它会移动到原型 N。

ArchetypeChunk(内存块)

实体的原型决定了 ECS 存储该实体组件的位置。ECS 以“块”的形式分配内存,每个块由一个ArchetypeChunk对象表示。块总是包含单个原型的实体。当一块内存变满时,ECS 会为使用相同原型创建的任何新实体分配一块新内存。如果您添加或删除组件,然后更改实体原型,ECS 会将该实体的组件移动到不同的块。

这种组织方案提供了原型和块之间的一对多关系。这也意味着找到具有给定组件集的所有实体只需要搜索现有的原型,这些原型通常数量很少,而不是所有实体,它们的数量通常要大得多。
ECS 不会以特定顺序存储块中的实体。当一个实体被创建或更改为新的原型时,ECS 将其放入存储原型的第一个块中,该块有空间。然而,块仍然紧紧地包装在一起。当实体从原型中移除时,ECS 将块中最后一个实体的组件移动到组件数组中新腾出的插槽中。

EntityQuery(实体查询)

要确定系统应该处理哪些实体,请使用EntityQuery。实体查询在现有原型中搜索具有符合您要求的组件的原型。您可以使用查询指定以下组件要求:

All — 原型必须包含All类别中的所有组件类型。
Any — 原型必须至少包含Any类别中的一种组件类型。
None— 原型不得包含无类别中的任何组件类型。
实体查询提供包含查询所需组件类型的块列表。然后,您可以直接使用IJobEntityBatch迭代这些块中的组件。

总结

欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。
如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~

声明:本博文章若非特殊注明皆为原创原文链接
https://blog.csdn.net/Wrinkle2017/article/details/121561876
————————————————————————————————

版权声明

版权声明:本博客为非营利性个人原创
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本博主进行联系
对于经本博主明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/906623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号