[unity] Fixed Timeline not pausing/resuming clip playback on PlayableDirector.pause. Closes #1920.

This commit is contained in:
Harald Csaszar 2021-07-06 17:46:47 +02:00
parent 20aebce749
commit 6d9e3e7e19

View File

@ -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;