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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值