赞
踩
Entities在ECS中,表示游戏或者应用中一个具体的实体。实体既没有行为也没有数据,它只是一个标识(可能就是个整数),表示将哪些数据(组件)组织到一起。System提供行为,Component存储数据。
Entity其实是个ID,你可以认为它是个超级轻量化的,甚至连name都没有的GameObject。Entity IDs是固定的,这样才可以用它在组件或者实体间建立引用关系。
EntityManager类管理World中的所有实体,持有一个实体列表,并且以极高的效率组织实体和数据。
虽然实体没有类型,但是可以根据它上面的数据组件来进行分类。当你创建实体并向其添加组件时,EntityManager会创建以个Entityarchetype结构体。可以使用已经有的原型来创建新的实体。也可以先创建原型,再根据原型创建实体(实际上推荐这样)。
创建实体
在编辑器中创建entity是最简单的方式,可以在场景中创建GameObject或者创建一个运行时转换成entity的prefab。此外,还可以创建一个生成系统(spawning system)在Job中创建多个enitties。最后,还可以调用EntityManager.CreateEntity接口创建。
Creating Entities with an EntityManager
选择合适的EntityManager.CreateEntity()版本创建Entities,Entities将被与EntityManager在同一个World中。
按照以下方式创建:
可以一次创建多个Entities:
Adding and Removing Components
Entity创建出来后,可以为其添加或者删除组件。该类操作同时改变了Entity的Archetype,并且Entity Manger会将该数据改变的Entity移动到新的Archetype对应的内存块中,同时重新组织原有Archetype内存块内的数据,保持紧密布局(通常是将最后一个Entity组件,移动到空出来的组件位置)。
Entity的改变,导致内存结构改变,这些改变包括,添加删除Component,改变SharedCompoentData的值,以及删除entity,同时这些操作不能再Job内执行,因为这会使Job正在操作的数据无效。如果要再Job中进行该类操作,必须添加相应的commands到EntityCommandBuffer中,并再Job完成后执行。
Entity Manger提供方法移除一个Entity的Component,同时提供方法移除Native Array中的所有Entities的指定组件。
Iterating entities
遍历所有匹配组件集合的entities,是ECS的核心架构,后面再说。
一个World(世界)包含一个Entity Manger和一系列的ComponentSystems,可以在该World中创建需要的对象。通常建议建立2个World,一个是模拟(逻辑)World,和一个渲染World。
游戏执行时,ECS默认会创建一个World,并创建所有的有效的ComponentSystem。也可以禁止自动创建World,而根据你自己的代码配置创建你的World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD禁止自动创建World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_EDITOR_WORLD禁止自动创建编辑器World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP禁止自动创建以上2种World。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。