📜  协程不受 time.timescale 统一的影响 - C# (1)

📅  最后修改于: 2023-12-03 15:07:20.398000             🧑  作者: Mango

协程不受 time.timescale 统一的影响 - C#

在 Unity 中,协程是非常常见的一种异步处理方式,它可以让我们在游戏运行中暂停一段时间,然后再继续运行后面的代码。而在协程中,我们可以使用 yield return new WaitForSeconds() 等语句来控制协程的运行时间。

然而,有时候我们会发现,当我们修改 time.timescale 的值后,协程的运行速度也会受到影响。比如,当我们将 time.timescale 的值改为 0.5 时,协程的延迟时间也会变为原来的一半。

这是因为,Unity 中的协程并不是完全独立于游戏时间的,它的延迟时间会受到 time.timescale 的影响。那么,如何让协程不受 time.timescale 统一的影响呢?下面是一种解决方法:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class CoroutineMgr : MonoBehaviour {

    private static CoroutineMgr instance;

    private List<Coroutine> coroutineList;

    void Awake ()
    {
        if (instance == null) {
            instance = this;
            DontDestroyOnLoad(gameObject);
            coroutineList = new List<Coroutine>();
        } else {
            Destroy(gameObject);
        }
    }
 
    public void StartUnscaledCoroutine (IEnumerator routine)
    {
        coroutineList.Add(StartCoroutine(routine));
    }
 
    public void StopUnscaledCoroutine (IEnumerator routine)
    {
        StopCoroutine(routine.ToString());
    }
 
    public void StopAllUnscaledCoroutines()
    {
        coroutineList.ForEach(coroutine => StopCoroutine(coroutine.ToString()));
        coroutineList.Clear();
    }
}

我们可以创建一个 CoroutineMgr 脚本,在其中定义我们需要的协程相关操作,并添加到一个不会被销毁的 GameObject 上。然后,在运行协程时,我们可以使用 StartUnscaledCoroutine 方法来启动一个不受 time.timescale 影响的协程,示例代码如下:

IEnumerator MyCoroutine()
{
    Debug.Log("Start MyCoroutine!");
    yield return new WaitForSecondsRealtime(5f); // 不受 time.timescale 影响的方法
    Debug.Log("End MyCoroutine!");
}
 
void Start () {
    CoroutineMgr.GetInstance().StartUnscaledCoroutine(MyCoroutine());
}

在上述示例代码中,我们使用了 WaitForSecondsRealTime 方法来等待 5 秒钟,它不受 time.timescale 影响。这样,在协程运行时,即使修改了 time.timescale 的值,也不会影响协程的延迟时间。

以上就是让协程不受 time.timescale 统一的影响的方法,希望对你有帮助!