Run 是直接在主线程上执行的,这个没什么需要解释的
Schedule 和 ScheduleParallel 都是放在多线程上并发执行的
我目前的理解是, Schedule 是在每一个 Foreach 后生成一个 Job
而 ScheduleParallel 划分 Job 是根据 Chunk 生成的,Chunk 是按 EntityArchetype 分配的
当一个 Chunk 的空间满了后,会再生成一个 Chunk,而这每一个 Chunk 都会成为一个 Job
所以从执行效率来看,ScheduleParallel 的大多数情况应该是优于 Schedule 的
而当我们只有一个 Chunk 的时候,Schedule 和 ScheduleParallel 的效果应该是一样的
这个可能是最简单方便的办法了,在场景中找到想要转换的 GameObject ,挂载 Convert To Entity 就可以进行转换了
需要提的一点是,这个组件有两种 Conversion Mode
Convert And Destroy | 转换后 删除 原有 GameObject |
Convert And Inject GameObject | 转换后 保留 原有 GameObject |
这个应该是最常用的办法了,生成的Entity会生成在和 EntityManager 相同的 World 中
EntityManager.CreateEntity( ) | 可以什么参数都不填,生成一个空的 Entity |
EntityManager.CreateEntity(params ComponentType[]) | 填入不定项个 ComponentType,可以直接生成带有这个 Component的Entity |
EntityManager.CreateEntity(EntityArchetype) | 利用原型 Archetype 来生成 Entity |
EntityManager.Instantiate(Entity) | 克隆一个现有的 Entity |
我们可以创建一个用来生成的类 Spawner ,继承 MonoBehaviour ,并实现 IDeclareReferencedPrefabs , IConvertGameObjectToEntity 接口
这个时候需要我们去实现接口中的两个方法,其中DeclareReferencedPrefabs的操作是referencedPrefabs.Add(Prefab)
这个Prefab是我们外部加载的GameObject,这个方法会在场景中生成一个Entity类型的一个Prefab
之后我们来实现Convert这个方法
首先我们来创建一个ComponentData,我们要确保这个里面包含Entity字段,并在Convert这个方法里使用conversionSystem.GetPrimaryEntity()将这个 Prefab 转化为 Entity 加载进去
最后我们使用dstManager.AddComponentData()方法,将这个ComponentData挂载到我们之前创建好的Entity当中
此时,我们就可以利用这个Entity来创建我们外部加载的Prefab了~