洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,最近在跟着大智探索DOTS。

从这节开始,咱们深入探索下ECS的每个部分。这节来探索Entity实体。

Entity是ECS三个核心成员之一。它代表了游戏或者应用中的独立个体。Entity虽然翻译成实体,但是它其实很虚,因为它既不是数据,也没有任何行为,它像是个容器,把数据(一个或多个component)组织在一起,有点类似一组数据的索引。

Entity实质上是一个ID。可以把它想象成一个非常轻量的GameObject,但是它连最基本的Transform组件都没有,甚至连名字都没有。Entity这个ID很稳定,你可以使用他们来引用到其他的组件或者实体。例如,子entity可以引用它的父entity。

ECS中有一个EntityManager类来管理一个World中的所有实体。EntityManager使用列表维护所有实体以及和实体关联的数据,以便达到最优的性能。

虽然entity没有类型,但是可以根据entity关联的component将他们分组,也就是上一节讲的实体原型(EntityArchetype),EntityManager会持续跟踪这些实体原型。你可以使用已有的EntityArchetype来创建entity,也可以提前创建EntityArchetype,以便后面的使用。

创建Entity

在Unity编辑器里创建Entity最简单,你可以通过设置,让ECS系统在运行时将GameObject或者Prefab转成entity。如果程序中有很多动态生成的entity,可以创建实体生成系统,在运行时使用job来创建多个entity。创建Entity需要调用的方法是EntityManager.CreateEntity

使用EntityManager创建实体

EntityManager.CreateEntity方法可以用来创建entity,创建出来的entity和EntityManager在同一个World中。

一个Word拥有一个EntityManager和多个System,你可以创建多个World对象。默认情况下,当你点击播放按钮进入运行模式后,会自动创建一个World,包含工程里所有的System。

通过以下方法可以一次创建一个Entity:

  • 使用ComponentType的数组来创建一个entity
EntityManager.CreateEntity(ComponentType[])
  • 使用EntityArchetype来创建一个entity
EntityManager.CreateEntity(EntityArchetype)
  • 通过EntityManager.Instantiate复制一个已有的entity,包括它里面的数据
EntityManager.Instantiate(Entity srcEntity)Instantiate(NativeArray<Entity> srcEntities, NativeArray<Entity> outputEntities)
  • 也可以创建一个空的Entity,在需要的时候在加上components。(见下文)

你也可以通过下面的方法一次创建多个Entity:

  • 使用CreateEntity方法一次性填充多个新的Entity到一个NativeArry中,这些entity用同样的原型
EntityManager.CreateEntity(EntityArchetype archetype, NativeArray<Entity> entities)
  • 使用Instantiate方法一次性复制多个entity,包含数据
EntityManager.Instantiate(NativeArray<Entity> srcEntities, NativeArray<Entity> outputEntities)

添加/移除component

创建完Entity后,你可以添加或者移除component。注意添加或移除component时,entity的原型会发生变化,这时候EntityManager需要将entity移到其他内存块,并将当前内存块的空位补上。

会造成Entity原型变化的操作不能在Job里面执行,比如添加移除component、修改SharedComponentData中的值、销毁entity。你可以将前面说的这几种操作放进EntityCommandBuffer中,在job执行完成后执行这个command buffer。后面还会具体讲解CommandBuffer。

struct Lifetime : IComponentData
{public byte Value;
}class LifetimeSystem : SystemBase
{EndSimulationEntityCommandBufferSystem m_EndSimulationEcbSystem;protected override void OnCreate(){base.OnCreate();// 从World中获取ECS系统并且存起来m_EndSimulationEcbSystem = World.GetOrCreateSystem<EndSimulationEntityCommandBufferSystem>();}protected override void OnUpdate(){// 请求一个ECB并且转换成可并行的var ecb = m_EndSimulationEcbSystem.CreateCommandBuffer().AsParallelWriter();Entities.ForEach((Entity entity, int entityInQueryIndex, ref Lifetime lifetime) =>{// 检测entity的lifetime,如果为0则销毁它if (lifetime.Value == 0){// 将entityInQueryIndex传给操作,这样ECS回放时能保证正确的顺序ecb.DestroyEntity(entityInQueryIndex, entity);}else{lifetime.Value -= 1;}}).ScheduleParallel();// 保证ECB system依赖当前这个Jobm_EndSimulationEcbSystem.AddJobHandleForProducer(this.Dependency);}
}

EntityManager也提供了方法用来添加、移除单个entity中的组件,也可以移除一个entity的NativeArray中的组件。后面组件部分会详细说明。

EntityManager.AddComponent(Entity entity, ComponentType componentType)

总结

Entity简单来说是一个简化版的GameObject,甚至连名字都不配拥有。数据和逻辑还是靠Component和System。

扩展阅读

【扩展学习】在洪流学堂公众号回复DOTS可以阅读本系列所有文章,更有视频教程等着你!


呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智(微信:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

ECS中的Entity实体相关推荐

  1. java实体类怎么写_Java中(entity)实体类的书写规范

    在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...

  2. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序 2 ...

  3. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

    原文地址:http://www.cnblogs.com/taven/p/3351841.html JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法 在Spr ...

  4. idea中Entity实体中报错:cannot resolve column/table/...解决办法。

    若idea中Entity实体中报错: cannot resolve column.... cannot resolve table... ......问题时解决办法为: 第一步: 第二步: 第三步:

  5. ofbiz之entity 实体解析 扩展 视图 复合列写法

    ofbiz 之entity实体 1. 实体定义文件 实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为%ofbiz-home%\applic ...

  6. html中空格字符实体整理

    摘要 浏览器总是会截短 HTML 页面中的空格.如果您在文本中写 10 个空格,在显示该页面之前,浏览器会删除它们中的 9 个.如需在页面中增加空格的数量,您需要使用 字符实体. 本篇就单介绍空格的字 ...

  7. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  8. 如何防止hibernate对entity实体的自动保存

    Hibernate有一个机制,对于get出来的实体,一旦用setxxx方法改变过属性值,在事务完结前它会很聪明地将其持久化(亦就是保存至数据库),不知道为什么它这样做,毕竟我还没有使用saveorup ...

  9. insights 磁力_在IBM ODM Decision Server Insights中冷却热实体

    insights 磁力 在任何大容量事件处理系统中,例如IBM®Operational Decision Manager(ODM)中的Decision Server Insights,被数千个事件引用 ...

最新文章

  1. 毋庸置疑,容器带来改变!
  2. 原版98启动盘镜像.img_装机技巧系列(二):系统安装之Windows 10启动盘制作
  3. 常见设计模式的思考1
  4. webservice 调用错误
  5. js-权威指南学习笔记4
  6. vs2015连接oracle(11g)的方法
  7. C语言分数加减乘除化简操作集(含测试源码)
  8. AI论文中 ACKNOWLEDGMENT的写法
  9. Java获取电脑外网ip地址方法
  10. 【web全景】web全景实现方案(转载)
  11. 社交媒体视频字幕AE模板 Podcast Badges for After Effects
  12. killall 命令的用法
  13. 学习人工智能必读这30本书!
  14. 光伏mppt扰动观察法仿真,matlab2018a
  15. 判断map的key的value是否为空
  16. 线性时不变(LTI)系统
  17. c语言初阶(第三篇)—函数
  18. [AGC056E]Cheese
  19. Amazon 云服务 名词解释
  20. 近视眼手术之后计算机专业,白领人士做完近视眼手术后,可以正常用电脑工作吗?...

热门文章

  1. linux打包java jar_在linux环境下修改可运行jar包配置并重新打包
  2. c语言设计底层,【学习小总结】C语言的底层开发
  3. layer 同步调用_YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
  4. 计算机的英语句子,唯美英语短句
  5. u盘在磁盘管理可以显示 但是电脑中找不到_关于U盘你不知道的一些知识
  6. 都说做作设计要多看多参考,那哪里才能找到优秀原创设计作品?
  7. 淘宝美工设计初学必会技能之PSD分层模板
  8. 优质淘宝产品描述页模板框架PSD分层模板,美工实用素材
  9. oracle存储过程拆分字符串函数,Oracle中利用存储过程来分割字符串
  10. cuSPARSE库:(七)cusparseCreate()的功能与作用