该示例的知识点:
1.EndSimulationEntityCommandBufferSystem
这个命令是在update函数的最后执行,该命令继承自EntityCommandBufferSystem,是EntityCommandBufferSystem的一个拓展,同时还存在一个在update最开始执行的命令BeginSimulationEntityCommandBufferSystem,也是ecb的一个拓展
2.如果需要在Job中对实体世界进行修改,那在job中需要ECB的ParallelWriter对象,通过源码可以看到出来ParallelWriter是ecb的一个内部构造体,里面包含了很多ecb的api
3.job类添加了一个 [WithAll(typeof(Cube))]标签,这个标签配合excute函数的参数,来确定那些实体对象需要执行该作业逻辑
[WithAll(typeof(Cube))][BurstCompile]public partial struct FallingCubeJob : IJobEntity{public float3 Movement;public EntityCommandBuffer.ParallelWriter ECB;void Execute([ChunkIndexInQuery] int chunkIndex, Entity entity, ref LocalTransform cubeTransform){cubeTransform.Position += Movement;if (cubeTransform.Position.y < 0){ECB.DestroyEntity(chunkIndex, entity);}}}
4.所有携带这个NewSpawn标签的实体,都执行下面的作业逻辑,也就是说这个示例把物体的生成和移动通过标签做了一个区分
[WithAll(typeof(NewSpawn))][BurstCompile]partial struct RandomPositionJob : IJobEntity{public uint SeedOffset;public void Execute([EntityIndexInQuery] int index, ref LocalTransform transform){// Random instances with similar seeds produce similar results, so to get proper// randomness here, we use CreateFromIndex, which hashes the seed.var random = Random.CreateFromIndex(SeedOffset + (uint)index);var xz = random.NextFloat2Direction() * 50;transform.Position = new float3(xz[0], 50, xz[1]);}}
5.SpawnSystem的主要逻辑是:查找所有的NewSpawn组件的实体,删除这个组件,然后克隆新的预制体,然后调用job设置实体位置,这个调度是针对那些新生成的物体,新生成的物体都带有NewSpawn这个组件(也就是标签)