protected override void OnDestroy() { if (_processDefaultAnimationGraphSystem == null) { return; } EntityQuery graphsQuery = GetEntityQuery(typeof(SimpleAnimationGraphData), typeof(SimpleAnimationClipData)); NativeArray <Entity> graphEntities = graphsQuery.ToEntityArray(Allocator.Temp); for (int i = 0; i < graphEntities.Length; i++) { Entity graphEntity = graphEntities[i]; SimpleAnimationGraphData simpleAnimationGraphData = EntityManager.GetComponentData <SimpleAnimationGraphData>(graphEntity); DynamicBuffer <SimpleAnimationClipData> clipDatas = EntityManager.GetBuffer <SimpleAnimationClipData>(graphEntity); DestroyGraph(_processDefaultAnimationGraphSystem, ref simpleAnimationGraphData, ref clipDatas); } graphEntities.Dispose(); _processDefaultAnimationGraphSystem.RemoveRef(); base.OnDestroy(); }
protected override void OnUpdate() { CompleteDependency(); float deltaTime = Time.DeltaTime; EntityCommandBuffer ecb = _endSimulationEntityCommandBufferSystem.CreateCommandBuffer(); Entities .WithName("CreateGraph") .WithNone <SimpleAnimationGraphData>() .WithoutBurst() .WithStructuralChanges() .ForEach((Entity e, ref Rig rig, ref SimpleAnimation simpleAnimation) => { SimpleAnimationGraphData graphData = CreateGraph(EntityManager, e, _processDefaultAnimationGraphSystem, in simpleAnimation, ref rig); ecb.AddComponent(e, graphData); }).Run(); Entities .WithName("DestroyGraph") .WithNone <SimpleAnimation>() .WithoutBurst() .WithStructuralChanges() .ForEach((Entity e, ref SimpleAnimationGraphData graphData, ref DynamicBuffer <SimpleAnimationClipData> clipDatas) => { DestroyGraph(_processDefaultAnimationGraphSystem, ref graphData, ref clipDatas); ecb.RemoveComponent <SimpleAnimationGraphData>(e); }).Run(); Dependency = Entities .ForEach(( Entity entity, ref SimpleAnimation simpleAnimation, ref SimpleAnimationDeltaTime dt, ref DynamicBuffer <SimpleAnimationClipData> simpleAnimationClipDatas) => { // Update time dt.Value = deltaTime; // Handle transitions if (simpleAnimation.IsTransitioning) { simpleAnimation.RemainingTransitionTime -= deltaTime; float normalizedTransitionTime = math.clamp(1f - (simpleAnimation.RemainingTransitionTime / simpleAnimation.TotalTransitionTime), 0f, 1f); simpleAnimation.SetWeight(1f - normalizedTransitionTime, simpleAnimation.FromClipIndex, ref simpleAnimationClipDatas); simpleAnimation.SetWeight(normalizedTransitionTime, simpleAnimation.ToClipIndex, ref simpleAnimationClipDatas); if (simpleAnimation.RemainingTransitionTime <= 0f) { simpleAnimation.IsTransitioning = false; } } }).Schedule(Dependency); Dependency.Complete(); // Update graph values NodeSet set = _processDefaultAnimationGraphSystem.Set; Entities .WithoutBurst() .ForEach(( Entity entity, ref SimpleAnimationGraphData simpleAnimationGraphData, ref DynamicBuffer <SimpleAnimationClipData> simpleAnimationClipDatas) => { // Handle setting and outputting values for (int i = 0; i < simpleAnimationClipDatas.Length; ++i) { SimpleAnimationClipData clipData = simpleAnimationClipDatas[i]; // Set weights if (clipData.WeightDirty) { set.SetData(simpleAnimationGraphData.NMixerNode, NMixerNode.KernelPorts.Weights, i, clipData.Weight); clipData.WeightDirty = false; } // Set speeds if (clipData.SpeedDirty) { set.SetData(clipData.ClipNode, ClipPlayerNode.KernelPorts.Speed, clipData.Speed); clipData.SpeedDirty = false; } // Set Time if (clipData.TimeDirty) { set.SendMessage(clipData.ClipNode, ClipPlayerNode.SimulationPorts.Time, clipData.Time); clipData.TimeDirty = false; } // TODO: Get time clipData.Time += deltaTime * clipData.Speed; simpleAnimationClipDatas[i] = clipData; } }).Run(); }