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之间的关系一样,在写法和结构都很类型,