docs.unity.cn
    Show / Hide Table of Contents

    Interface IJobChunk

    IJobChunk is a type of Job that iterates over a set of ArchetypeChunk instances.

    Namespace: Unity.Entities
    Syntax
    [JobProducerType(typeof(JobChunkExtensions.JobChunkProducer<>))]
    public interface IJobChunk
    Remarks

    Create and schedule an IJobChunk Job inside the OnUpdate() function of a SystemBase implementation. The Job component system calls the Execute function once for each ArchetypeChunk found by the EntityQuery used to schedule the Job.

    To pass data to the Execute function beyond the parameters of the Execute() function, add public fields to the IJobChunk struct declaration and set those fields immediately before scheduling the Job. You must pass the component type information for any components that the Job reads or writes using a field of type, ComponentTypeHandle<T>. Get this type information by calling the appropriate GetComponentTypeHandle<T>(Boolean) function for the type of component.

    For more information see Using IJobChunk.

    [GenerateAuthoringComponent]
    public struct Target : IComponentData
    {
       public Entity entity;
    }
    
    public partial class ChaserSystem : SystemBase
    {
       private EntityQuery query; // Initialized in Oncreate()
    
       [BurstCompile]
       private struct ChaserSystemJob : IJobChunk
       {
           // Read-write data in the current chunk
           public ComponentTypeHandle<Translation> PositionTypeHandle;
    
           // Read-only data in the current chunk
           [ReadOnly]
           public ComponentTypeHandle<Target> TargetTypeHandle;
    
           // Read-only data stored (potentially) in other chunks
           [ReadOnly]
           //[NativeDisableParallelForRestriction]
           public ComponentDataFromEntity<LocalToWorld> EntityPositions;
    
           // Non-entity data
           public float deltaTime;
    
           public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
           {
               NativeArray<Translation> positions = chunk.GetNativeArray<Translation>(PositionTypeHandle);
               NativeArray<Target> targets = chunk.GetNativeArray<Target>(TargetTypeHandle);
    
               for (int i = 0; i < positions.Length; i++)
               {
                   Entity targetEntity = targets[i].entity;
                   float3 targetPosition = EntityPositions[targetEntity].Position;
                   float3 chaserPosition = positions[i].Value;
    
                   float3 displacement = (targetPosition - chaserPosition);
                   positions[i] = new Translation { Value = chaserPosition + displacement * deltaTime };
               }
           }
       }
    
       protected override void OnCreate()
       {
           query = this.GetEntityQuery(typeof(Translation), ComponentType.ReadOnly<Target>());
       }
    
       protected override void OnUpdate()
       {
           var job = new ChaserSystemJob();
           job.PositionTypeHandle = this.GetComponentTypeHandle<Translation>(false);
           job.TargetTypeHandle = this.GetComponentTypeHandle<Target>(true);
    
           job.EntityPositions = this.GetComponentDataFromEntity<LocalToWorld>(true);
           job.deltaTime = this.Time.DeltaTime;
    
           this.Dependency = job.Schedule(query, this.Dependency);
       }
    }

    Methods

    Name Description
    Execute(ArchetypeChunk, Int32, Int32)

    Implement the Execute() function to perform a unit of work on an ArchetypeChunk.

    Back to top Copyright © 2022 Unity Technologies
    Generated by DocFX
    on Wednesday, July 6, 2022
    Terms of use