调试UI界面,在测试场景没问题,但放到项目场景中就不执行了。查了好久发现跟Time.timeScale为0有关,找到解决方法。
方法1:取消或重新设置Time.timeScale为1。
方法2:设置Time.timeScale为一个特别小的值(0.1),缓慢执行Time.timeScale相关的方法,在执行特定动画时再单独加速执行DOTween的相关方法,比如DOMoveX(xxx, 0.1f)。
方法3:添加.SetUpdate(true)方法即可忽略,DOMoveX(xxx, 0.1f).SetUpdate(true)。或者以下代码
Sequence gameoverSequence = null;
light.gameObject.SetActive(true);
if (gameoverSequence==null) {
gameoverSequence = DOTween.Sequence();
gameoverSequence.Append(light.DORotate(new Vector3(0, 0, 180), 3).SetEase(Ease.Linear))
.Append(light.DORotate(new Vector3(0, 0, 360), 3).SetEase(Ease.Linear)).SetLoops(-1).SetUpdate(true).Pause();
Debug.Log("Record DoTweenSeq.");
}
gameoverSequence.Play();
还可以参考Unity-Dotween的初级使用_Unity小码农的博客-CSDN博客_dotween声音
方法4:其他 转载记录一下
最近在调战斗时的动画与特效,Unity3D对加/减速提供了Time.timeScale支持。但是,timeScale提供的是全局的时间缩放,而我们有些动作或动画是不希望被timeScale加减速的。比如,《刀塔传奇》中播放大招时,除了大招特效,所有别的动作/动画都暂停。
下面分别是Animation、Animator和粒子特效的ignoreTimeScale方法。
Animation
Time.realtimeSinceStartup记录是不受timeScale影响的真实时间,利用它来在每一帧采样播放Animation。代码片段如下:
AnimationState animState = animation[clipName]; // 当前动画状态
curTime = Time.realtimeSinceStartup; // 当前真实时间
deltaTime = curTime - lastFrameTime; // 此帧与上一帧的时间间隔
lastFrameTime = curTime; // 记录此帧时间,下一帧用
progressTime += deltaTime; // 动画已播放时间
animState.normalizedTime = progressTime / currState.length; // 动画规范化时间[0-1]
animation.Sample(); // 在当前状态对动画进行采样,当你想显式设置动画状态并且对它取样的时候使用
Animator
Animator _animator = ...;
public void Update() {
_animator.updateMode = AnimatorUpdateMode.UnscaledTime; // 指定该Animator更新模式为不受scale影响
}
粒子特效
对于ParticleEmitter
ParticleEmitter _emitter = ...;
public void Update() {
_emitter.Simulate(Time.unscaledDeltaTime);
}
对于ParticleSystem
ParticleSystem _particleSystem = ...;
public void Update() {
_particleSystem.Simulate(Time.unscaledDeltaTime, true, false);
}