Search Unity

  1. Unity Asset Manager is now available in public beta. Try it out now and join the conversation here in the forums.
    Dismiss Notice

Question IJobForEach to IJobChunk

Discussion in 'DOTS Animation' started by Alex0621, Sep 17, 2021.

  1. Alex0621

    Alex0621

    Joined:
    Sep 2, 2013
    Posts:
    4
    Hi All!
    I've got a problem with IJobChunk implimentation.
    Execute in SpriteSheetAnimation_Job not invoking.
    So, my code:
    Code (CSharp):
    1. public struct SpriteSheetAnimation_Data : IComponentData
    2. {
    3.     public int currentFrame;
    4.     public int frameCount;
    5.     public float frameTimer;
    6.     public float frameTimerMax;
    7.     public Quaternion rotation;
    8.     public Vector3 scale;
    9.     public Color32 color;
    10.     public Vector4 uv;
    11.     public Matrix4x4 matrix;
    12. }
    13. [BurstCompile]
    14. public struct SpriteSheetAnimation_Job : IJobChunk
    15. {
    16.     public ComponentTypeHandle<SpriteSheetAnimation_Data> spriteSheetAnimationData;
    17.     public ComponentTypeHandle<Translation> translation;
    18.     [ReadOnly]
    19.     public float deltaTime;
    20.     public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
    21.     {
    22.         var sad = chunk.GetNativeArray(spriteSheetAnimationData);
    23.         var t = chunk.GetNativeArray(translation);
    24.         for (int i = 0; i < chunk.Count; i++)
    25.         {
    26.             var isad = sad[i];
    27.             var it = t[i];
    28.             isad.frameTimer += deltaTime;
    29.             while (isad.frameTimer >= isad.frameTimerMax)
    30.             {
    31.                 isad.frameTimer -= isad.frameTimerMax;
    32.                 isad.currentFrame = (isad.currentFrame + 1) % isad.frameCount;
    33.                 isad.uv.x = 1f / isad.frameCount;
    34.                 isad.uv.y = 1f;
    35.                 isad.uv.z = isad.uv.x * isad.currentFrame;
    36.                 isad.uv.w = 0f;
    37.                 isad.matrix = Matrix4x4.TRS(it.Value, isad.rotation, isad.scale);
    38.             }
    39.         }
    40.     }
    41. }
    42. public class SpriteSheetAnimation_Animate : JobComponentSystem
    43. {
    44.     private EntityQuery m_Query;
    45.     protected override void OnCreate()
    46.     {
    47.         m_Query = GetEntityQuery(
    48.             ComponentType.ReadWrite<SpriteSheetAnimation_Data>(),
    49.             ComponentType.ReadWrite<Translation>());
    50.     }
    51.     protected override JobHandle OnUpdate(JobHandle inputDeps)
    52.     {
    53.         var sad = GetComponentTypeHandle<SpriteSheetAnimation_Data>();
    54.         var t = GetComponentTypeHandle<Translation>();
    55.         var job = new SpriteSheetAnimation_Job
    56.         {
    57.             spriteSheetAnimationData = sad,
    58.             translation = t,
    59.             deltaTime = Time.DeltaTime
    60.         };
    61.         return job.Schedule(m_Query, inputDeps);
    62.     }
    63. }
    This old code with IJobForEach (working fine)
    Code (CSharp):
    1. public class SpriteSheetAnimation_Animate : JobComponentSystem
    2. {
    3.  
    4.     [BurstCompile]
    5.     public struct SpriteSheetAnimation_Job : IJobForEach<SpriteSheetAnimation_Data, Translation>
    6.     {
    7.         public float deltaTime;
    8.  
    9.         public void Execute(ref SpriteSheetAnimation_Data spriteSheetAnimationData, ref Translation translation)
    10.         {
    11.             spriteSheetAnimationData.frameTimer += deltaTime;
    12.             while (spriteSheetAnimationData.frameTimer >= spriteSheetAnimationData.frameTimerMax)
    13.             {
    14.                 spriteSheetAnimationData.frameTimer -= spriteSheetAnimationData.frameTimerMax;
    15.                 spriteSheetAnimationData.currentFrame =
    16.                     (spriteSheetAnimationData.currentFrame + 1) % spriteSheetAnimationData.frameCount;
    17.  
    18.                 spriteSheetAnimationData.uv.x = 1f / spriteSheetAnimationData.frameCount;
    19.                 spriteSheetAnimationData.uv.y = 1f;
    20.                 spriteSheetAnimationData.uv.z = spriteSheetAnimationData.uv.x * spriteSheetAnimationData.currentFrame;
    21.                 spriteSheetAnimationData.uv.w = 0f;
    22.  
    23.                 spriteSheetAnimationData.matrix = Matrix4x4.TRS(translation.Value, spriteSheetAnimationData.rotation, spriteSheetAnimationData.scale);
    24.             }
    25.         }
    26.     }
    27.  
    28.     protected override JobHandle OnUpdate(JobHandle inputDeps)
    29.     {
    30.         var job = new SpriteSheetAnimation_Job
    31.         {
    32.             deltaTime = Time.DeltaTime
    33.         };
    34.         return job.Schedule(this, inputDeps);
    35.     }
    36. }

    Please, advice me, how can i solve this issue.
     
  2. vectorized-runner

    vectorized-runner

    Joined:
    Jan 22, 2018
    Posts:
    398
    You're copying the struct value when doing
    var isad = sad[i]
    , so after doing your computations you need to assign it back the original array
     
  3. Alex0621

    Alex0621

    Joined:
    Sep 2, 2013
    Posts:
    4