您的位置:首页 > 科技 > 能源 > EntitiesSample_10. RandomSpawn

EntitiesSample_10. RandomSpawn

2025/1/16 20:17:45 来源:https://blog.csdn.net/Er_nameSpace/article/details/139553505  浏览:    关键词:EntitiesSample_10. RandomSpawn

该示例的知识点:

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这个组件(也就是标签)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com