From 6fee0e3622738c2781c3a4b3debfbf2ab4f9e9d3 Mon Sep 17 00:00:00 2001 From: pharan Date: Sat, 6 Oct 2018 02:39:29 +0800 Subject: [PATCH] [unity] Use dummy AnimationState for AnimationState timeline mixer preview. --- .../SpineAnimationStateMixerBehaviour.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs index a4994157c..6c94d2eb8 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Modules/Timeline/SpineAnimationState/SpineAnimationStateMixerBehaviour.cs @@ -105,6 +105,9 @@ namespace Spine.Unity.Playables { } #if SPINE_EDITMODEPOSE + + AnimationState dummyAnimationState; + public void PreviewEditModePose (Playable playable, SkeletonAnimation spineComponent) { if (Application.isPlaying) return; if (spineComponent == null) return; @@ -150,11 +153,28 @@ namespace Spine.Unity.Playables { // Approximate what AnimationState might do at runtime. if (fromAnimation != null && mixDuration > 0 && toClipTime < mixDuration) { + dummyAnimationState = dummyAnimationState ?? new AnimationState(spineComponent.skeletonDataAsset.GetAnimationStateData()); + + var toTrack = dummyAnimationState.GetCurrent(0); + var fromTrack = toTrack != null ? toTrack.mixingFrom : null; + bool isAnimationTransitionMatch = (toTrack != null && toTrack.animation == toAnimation && fromTrack != null && fromTrack.animation == fromAnimation); + + if (!isAnimationTransitionMatch) { + dummyAnimationState.ClearTracks(); + fromTrack = dummyAnimationState.SetAnimation(0, fromAnimation, fromClipLoop); + fromTrack.AllowImmediateQueue(); + toTrack = dummyAnimationState.SetAnimation(0, toAnimation, clipData.loop); + } + + // Update track times. + fromTrack.trackTime = fromClipTime; + toTrack.trackTime = toClipTime; + toTrack.mixTime = toClipTime; + + // Apply Pose skeleton.SetToSetupPose(); - float fauxFromAlpha = (1f - toClipTime/mixDuration); - fauxFromAlpha = fauxFromAlpha > 0.5f ? 1f : fauxFromAlpha * 2f; // fake value, but reduce dip. - fromAnimation.Apply(skeleton, 0, fromClipTime, fromClipLoop, null, fauxFromAlpha, MixBlend.Setup, MixDirection.Out); //fromAnimation.PoseSkeleton(skeleton, fromClipTime, fromClipLoop); - toAnimation.Apply(skeleton, 0, toClipTime, clipData.loop, null, toClipTime/mixDuration, MixBlend.Replace, MixDirection.In); + dummyAnimationState.Update(0); + dummyAnimationState.Apply(skeleton); } else { skeleton.SetToSetupPose(); toAnimation.PoseSkeleton(skeleton, toClipTime, clipData.loop);