diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Editor/SpineAnimationStateDrawer.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Editor/SpineAnimationStateDrawer.cs index 931fc3583..268d60848 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Editor/SpineAnimationStateDrawer.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Editor/SpineAnimationStateDrawer.cs @@ -109,7 +109,12 @@ public class SpineAnimationStateDrawer : PropertyDrawer { EditorGUI.PropertyField(singleFieldRect, useBlendDurationProp); singleFieldRect.y += lineHeightWithSpacing; - EditorGUI.PropertyField(singleFieldRect, mixDurationProp); + + bool greyOutMixDuration = (!useBlendDurationProp.hasMultipleDifferentValues && + useBlendDurationProp.boolValue == true); + using (new EditorGUI.DisabledGroupScope(greyOutMixDuration)) { + EditorGUI.PropertyField(singleFieldRect, mixDurationProp); + } } singleFieldRect.y += lineHeightWithSpacing; diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateBehaviour.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateBehaviour.cs index c5dd632f9..0e76688b2 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateBehaviour.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateBehaviour.cs @@ -41,6 +41,9 @@ namespace Spine.Unity.Playables { [Serializable] public class SpineAnimationStateBehaviour : PlayableBehaviour { + + [NonSerialized] public TimelineClip timelineClip; + public AnimationReferenceAsset animationReference; public bool loop; diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateClip.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateClip.cs index 0ab9b18f4..13121c1f5 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateClip.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateClip.cs @@ -38,8 +38,11 @@ namespace Spine.Unity.Playables { public SpineAnimationStateBehaviour template = new SpineAnimationStateBehaviour(); public ClipCaps clipCaps { get { return ClipCaps.Blending | ClipCaps.ClipIn | ClipCaps.SpeedMultiplier | (template.loop ? ClipCaps.Looping : 0); } } + [NonSerialized] public TimelineClip timelineClip; public override Playable CreatePlayable (PlayableGraph graph, GameObject owner) { + template.timelineClip = this.timelineClip; + var playable = ScriptPlayable.Create(graph, template); playable.GetBehaviour(); return playable; 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 aa9fa5086..0bfae9f15 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 @@ -95,6 +95,8 @@ namespace Spine.Unity.Playables { } protected void HandleClipEnd () { + if (animationStateComponent == null) return; + var state = animationStateComponent.AnimationState; if (endAtClipEnd && timelineStartedTrackEntry != null && @@ -172,13 +174,14 @@ namespace Spine.Unity.Playables { endMixOutDuration = clipData.endMixOutDuration; if (clipData.animationReference == null) { - float mixDuration = clipData.customDuration ? clipData.mixDuration : state.Data.DefaultMix; + float mixDuration = clipData.customDuration ? GetCustomMixDuration(clipData) : state.Data.DefaultMix; state.SetEmptyAnimation(trackIndex, mixDuration); } else { if (clipData.animationReference.Animation != null) { TrackEntry currentEntry = state.GetCurrent(trackIndex); Spine.TrackEntry trackEntry; - if (currentEntry == null && (clipData.customDuration && clipData.mixDuration > 0)) { + float customMixDuration = clipData.customDuration ? GetCustomMixDuration(clipData) : 0.0f; + if (currentEntry == null && customMixDuration > 0) { state.SetEmptyAnimation(trackIndex, 0); // ease in requires empty animation trackEntry = state.AddAnimation(trackIndex, clipData.animationReference.Animation, clipData.loop, 0); } else @@ -192,7 +195,7 @@ namespace Spine.Unity.Playables { trackEntry.HoldPrevious = clipData.holdPrevious; if (clipData.customDuration) - trackEntry.MixDuration = clipData.mixDuration; + trackEntry.MixDuration = customMixDuration; timelineStartedTrackEntry = trackEntry; } @@ -314,6 +317,14 @@ namespace Spine.Unity.Playables { } #endif + float GetCustomMixDuration (SpineAnimationStateBehaviour clipData) { + if (clipData.useBlendDuration) { + TimelineClip clip = clipData.timelineClip; + return (float)Math.Max(clip.blendInDuration, clip.easeInDuration); + } else { + return clipData.mixDuration; + } + } } } diff --git a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs index 4165d5bba..502234ee9 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.timeline/Runtime/SpineAnimationState/SpineAnimationStateTrack.cs @@ -27,6 +27,7 @@ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ +using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; @@ -39,6 +40,13 @@ namespace Spine.Unity.Playables { public int trackIndex = 0; public override Playable CreateTrackMixer (PlayableGraph graph, GameObject go, int inputCount) { + IEnumerable clips = this.GetClips(); + foreach (TimelineClip clip in clips) { + var animationStateClip = clip.asset as SpineAnimationStateClip; + if (animationStateClip != null) + animationStateClip.timelineClip = clip; + } + var scriptPlayable = ScriptPlayable.Create(graph, inputCount); var mixerBehaviour = scriptPlayable.GetBehaviour(); mixerBehaviour.trackIndex = this.trackIndex;