From 6d9e3e7e19807c016a3480c196027036d291744e Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 6 Jul 2021 17:46:47 +0200 Subject: [PATCH] [unity] Fixed Timeline not pausing/resuming clip playback on PlayableDirector.pause. Closes #1920. --- .../SpineAnimationStateMixerBehaviour.cs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs index 17c998c95..abe4f0d1b 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs @@ -40,12 +40,49 @@ namespace Spine.Unity.Playables { float[] lastInputWeights; public int trackIndex; + IAnimationStateComponent animationStateComponent; + bool isPaused = false; + TrackEntry pausedTrackEntry; + float previousTimeScale = 1; + + public override void OnBehaviourPause (Playable playable, FrameData info) { + if (!isPaused) + HandlePause(playable); + isPaused = true; + } + + public override void OnBehaviourPlay (Playable playable, FrameData info) { + if (isPaused) + HandleResume(playable); + isPaused = false; + } + + protected void HandlePause (Playable playable) { + if (animationStateComponent == null) return; + + TrackEntry current = animationStateComponent.AnimationState.GetCurrent(trackIndex); + if (current != null) { + previousTimeScale = current.TimeScale; + current.TimeScale = 0; + pausedTrackEntry = current; + } + } + + protected void HandleResume (Playable playable) { + if (animationStateComponent == null) return; + + TrackEntry current = animationStateComponent.AnimationState.GetCurrent(trackIndex); + if (current != null && current == pausedTrackEntry) { + current.TimeScale = previousTimeScale; + } + } + // NOTE: This function is called at runtime and edit time. Keep that in mind when setting the values of properties. public override void ProcessFrame (Playable playable, FrameData info, object playerData) { var skeletonAnimation = playerData as SkeletonAnimation; var skeletonGraphic = playerData as SkeletonGraphic; - var animationStateComponent = playerData as IAnimationStateComponent; + animationStateComponent = playerData as IAnimationStateComponent; var skeletonComponent = playerData as ISkeletonComponent; if (animationStateComponent == null || skeletonComponent == null) return;