protected override void OnUpdate() { var dt = Time.DeltaTime; var commandBuffer = m_ECBSystem.CreateCommandBuffer().AsParallelWriter(); Dependency = Entities .WithBurst(FloatMode.Fast) .WithAll <UpdateAnimationTimeTag>() .ForEach( (Entity entity, int entityInQueryIndex, ref TinyAnimationTime time, ref TinyAnimationPlaybackInfo info) => { switch (info.WrapMode) { case WrapMode.Once: { time.Value += dt; if (time.Value >= info.Duration) { commandBuffer.RemoveComponent <UpdateAnimationTimeTag>(entityInQueryIndex, entity); commandBuffer.RemoveComponent <ApplyAnimationResultTag>(entityInQueryIndex, entity); time.Value = 0.0f; time.InternalWorkTime = 0.0f; } break; } case WrapMode.ClampForever: { time.Value = math.min(time.Value + dt, info.Duration); break; } case WrapMode.Loop: { time.Value = AnimationMath.Repeat(time.Value + dt, info.Duration); break; } case WrapMode.PingPong: { time.InternalWorkTime = AnimationMath.Repeat(time.InternalWorkTime + dt, info.Duration * 2.0f); time.Value = AnimationMath.PingPong(time.InternalWorkTime, info.Duration); break; } } }) .Schedule(Dependency); m_ECBSystem.AddJobHandleForProducer(Dependency); }
public static void SetTime(World world, Entity entity, float newTime) { AssertEntityIsValidAnimationPlayer(world, entity); var currentClip = world.EntityManager.GetComponentData <TinyAnimationPlayer>(entity).CurrentClip; var info = world.EntityManager.GetComponentData <TinyAnimationPlaybackInfo>(currentClip); if (newTime < 0.0f) { newTime = 0.0f; } else if (newTime > info.Duration) { switch (info.WrapMode) { case WrapMode.Once: { newTime = 0.0f; break; } case WrapMode.ClampForever: { newTime = info.Duration; break; } case WrapMode.Loop: { newTime = AnimationMath.Repeat(newTime, info.Duration); break; } case WrapMode.PingPong: { newTime = AnimationMath.PingPong(newTime, info.Duration); break; } } } world.EntityManager.SetComponentData(currentClip, new TinyAnimationTime { Value = newTime, InternalWorkTime = newTime }); }