EntitiesSample_5. IJobChunk

 public partial struct RotationSystem : ISystem
    {
        [BurstCompile]
        public void OnCreate(ref SystemState state)
        {
            state.RequireForUpdate<ExecuteIJobChunk>();
        }

        [BurstCompile]
        public void OnUpdate(ref SystemState state)
        {
            var spinningCubesQuery = SystemAPI.QueryBuilder().WithAll<RotationSpeed, LocalTransform>().Build();
            //创建一个事务,这个事务针对于LocalTransform,RotationSpeed组件的实体
            var job = new RotationJob
            {
                TransformTypeHandle = SystemAPI.GetComponentTypeHandle<LocalTransform>(),
                RotationSpeedTypeHandle = SystemAPI.GetComponentTypeHandle<RotationSpeed>(true),

                DeltaTime = SystemAPI.Time.DeltaTime
            };

            //与IJobEntity不同,IJobChunk必须手动传递查询。
            //此外,IJobChunk不会传递和分配状态。依赖关系JobHandle隐式。
            //(这种传递和分配状态的模式。依赖关系确保实体作业计划
            //在不同的系统中将根据需要彼此依赖。)
            //以上是百度的翻译,我的理解是 state.Dependency 类似于函数的回调,该系统依赖于事                务调度的完成
            state.Dependency = job.Schedule(spinningCubesQuery, state.Dependency);
        }
    }

    [BurstCompile]
    struct RotationJob : IJobChunk
    {
        //TransformTypeHandle是LocalTransform的句柄
        public ComponentTypeHandle<LocalTransform> TransformTypeHandle;
        //RotationSpeedTypeHandle是RotationSpeed的句柄
        [ReadOnly] public ComponentTypeHandle<RotationSpeed> RotationSpeedTypeHandle;
        public float DeltaTime;
        /// <summary>
        /// 函数的参数是固定的
        /// 通过成员变量的句柄确定实体
        /// </summary>

        public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask,
            in v128 chunkEnabledMask)
        {
            //当区块中的一个或多个实体具有禁用的查询组件时,useEnableMask参数为true。如果没                 有查询组件类型实现IEnableableComponent,
            //我们可以假设useEnabledMask将始终为false。
            //然而,最好添加此保护检查以备不时之需
            //稍后有人更改查询或组件类型。
            //在执行中,需要判断一下,当前的实体的组件是不是禁用状态
            Assert.IsFalse(useEnabledMask);

            var transforms = chunk.GetNativeArray(ref TransformTypeHandle);
            var rotationSpeeds = chunk.GetNativeArray(ref RotationSpeedTypeHandle);
            for (int i = 0, chunkEntityCount = chunk.Count; i < chunkEntityCount; i++)
            {
                transforms[i] = transforms[i].RotateY(rotationSpeeds[i].RadiansPerSecond * DeltaTime);
            }
        }
    }

该实例说明IJobChunk的使用,个人理解是IJobChunk有点像是IJobEntity的封装,就像是IAspect和IComponent之间的关系一样,在写法和结构都很类型,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值