测试问题的代码
测试 Time.timeScale = 0 的情况下,一些函数的执行情况:
using System;
using System.Collections;
using UnityEngine;
namespace Temp
{
public class TestTimeScale : MonoBehaviour
{
private bool m_openInvoke = false;
private bool m_openCoroutine = false;
[ContextMenu("恢复")]
public void RestoreTimeScale()
{
Time.timeScale = 1;
}
private void OnEnable()
{
Time.timeScale = 0;
Invoke(nameof(InvokeFunc), 1f);
StartCoroutine(IEnumeratorFunc_With_WaitForSecondsRealtime());
StartCoroutine(IEnumeratorFunc_With_WaitForSeconds());
Debug.Log($"Time.timeScale={Time.timeScale}");
}
private void Update()
{
Debug.Log(nameof(Update));
}
private void LateUpdate()
{
Debug.Log(nameof(LateUpdate));
}
private void FixedUpdate()
{
Debug.Log(nameof(FixedUpdate));
}
private void InvokeFunc()
{
Debug.Log(nameof(InvokeFunc));
}
private IEnumerator IEnumeratorFunc_With_WaitForSecondsRealtime()
{
for (int i = 0; i < 100; i++)
{
Debug.Log(nameof(IEnumerator));
yield return new WaitForSecondsRealtime(1);
}
yield return null;
}
private IEnumerator IEnumeratorFunc_With_WaitForSeconds()
{
for (int i = 0; i < 100; i++)
{
Debug.Log(nameof(IEnumerator));
yield return new WaitForSeconds(1);
}
yield return null;
}
}
}
运行输出如下:
结论
当 Time.timeScale = 0 的时候:
- Update,LateUpdate 会正常执行。
- FixedUpdate 会停止执行。
- Invoke 不会执行。
- 协程 函数体会执行,但是根据 yield return 的不同条件,可能会受到 Time.timeScale 的影响。比如: WaitForSecondsRealtime 、WaitForSeconds。
- Time.deltaTime = 0。
声音的处理
private void OnTimeScaleChange()
{
foreach (var comp in m_allAudioSource)
{
if (!comp) {
continue;
}
if (comp.isPlaying)
{
comp.pitch = Time.timeScale;
}
}
}