Unity 2D 2020技术问题:如何让动画在暂停的Timeline中持续播放?
解决Timeline暂停后说话动画继续循环的方案
方案一:分离动画载体(你的思路完全可行)
- 把说话动画和基础Idle动画分别挂到两个独立的GameObject上(比如
角色_说话动画和角色_Idle),Idle动画的对象作为默认显示的主体,说话动画对象默认隐藏。 - Timeline里只控制Idle动画的播放/暂停,以及通过Activation轨道控制说话动画对象的显示状态。
- 暂停Timeline时,直接让说话动画的
Animator独立循环:- 给说话动画的GameObject加
Animator,设置好循环的说话动画状态。 - 修改你的暂停脚本:
public class PauseTimeline : MonoBehaviour { private PlayableDirector director; public Animator speechAnimator; // 拖拽说话动画的Animator进来 void Start() { director = GetComponent<PlayableDirector>(); speechAnimator.enabled = false; // 默认关闭 } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { PlayTime(); } } public void PauseTime() { director.Pause(); speechAnimator.enabled = true; speechAnimator.SetTrigger("StartSpeech"); // 触发循环动画 } public void PlayTime() { director.Play(); speechAnimator.enabled = false; // 恢复Timeline控制时关闭独立动画 } } - 给说话动画的GameObject加
方案二:修改Timeline轨道的时间更新模式
- 不用拆分对象,直接给说话动画轨道做特殊设置:
- 选中Timeline里的说话动画轨道,在Inspector里把Update Mode从
Timeline改成Unscaled Time。 - 同时把说话动画对应的
Animator组件的Update Mode也设为Unscaled Time。 - 这样Timeline暂停时,这个轨道的动画会脱离Timeline的时间控制,按照实际时间继续循环播放。
- 记得把说话动画在Animator里设置为循环状态,且暂停时该轨道处于播放状态。
- 选中Timeline里的说话动画轨道,在Inspector里把Update Mode从
方案三:代码强制驱动动画
- 不想改Timeline的话,也可以在暂停后用代码强行更新说话动画:
public class PauseTimeline : MonoBehaviour { private PlayableDirector director; public Animator characterAnimator; private int speechAnimHash = Animator.StringToHash("SpeechLoop"); // 替换成你的说话动画状态名 void Start() { director = GetComponent<PlayableDirector>(); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { PlayTime(); } // 暂停期间强制更新说话动画 if (!director.playableGraph.IsPlaying()) { if (characterAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash != speechAnimHash) { characterAnimator.Play(speechAnimHash, 0, 0f); } characterAnimator.Update(Time.unscaledDeltaTime); } } public void PauseTime() { director.Pause(); } public void PlayTime() { director.Play(); } }
内容的提问来源于stack exchange,提问作者Moonlit Buns
相关产品推荐
相关产品推荐

