Unity同步加载和异步加载场景

1.同步加载场景与异步加载场景

同步加载场景顾名思义,加载场景这个步骤与当前场景共用一个逻辑线程,也就是说,在加载场景时,原场景的逻辑将等待场景的加载,如果加载的场景过大,就会造成卡顿。

异步加载场景顾名思义,加载场景这个步骤将与当前场景不属于同一线程,在加载场景时,原场景的逻辑并不会等待场景的加载,也就不会有卡顿。(一般推荐使用异步加载)

2.加载场景前的准备工作

2.1 将需要加载的场景导入SceneInBuild,直接把project面板中的场景文件直接拖入即可

img

2.2 using命名空间

using UnityEngine.SceneManagement;

3.同步加载场景

3.1 使用场景顺序号加载场景

SceneManager.LoadScene(1, LoadSceneMode.Additive);//第二个参数表示不删除原场景,而是将新场景附加到原场景上,适合将大地图分为多个小场景进行加载时使用。
SceneManager.LoadScene(1,LoadSceneMode.Single);//第二个参数表示会在新场景加载完成后删除原场景,不填写这个参数时默认就是这个模式。
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex)//直接获取当前场景的场景顺序号,可用于重新加载当前关卡。

3.2 使用场景名称加载场景

SceneManager.LoadScene("SceneName", LoadSceneMode.Additive);//第二个参数表示不删除原场景,而是将新场景附加到原场景上,适合将大地图分为多个小场景进行加载时使用。
SceneManager.LoadScene("SceneName",LoadSceneMode.Single);//第二个参数表示会在新场景加载完成后删除原场景,不填写这个参数时默认就是这个模式。
SceneManager.LoadScene(SceneManager.GetActiveScene().name)//直接获取当前场景的场景顺序号,可用于重新加载当前关卡。

3.3 演示代码

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

public class loading : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 同步加载场景
        SceneManager.LoadScene(1, LoadSceneMode.Additive);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

4.异步加载场景

异步加载场景与同步加载场景的操作略有不同

4.1 异步加载需要先介 AsyncOperation 类

SceneManager.LoadSceneAsync(1,LoadSceneMode.Additive)// 这个是异步加载的函数,其参数的用法跟同步加载的用法一致,然后,返回值 是一个 AsyncOperation 类。
AsyncOperation.isDone;// 这个是用来判断加载是否完成。这个属性是加载完并且跳转成功后才会变成完成
AsyncOperation.allowSceneActivation;// 这个是加载完后,是否允许跳转,当为false时,即使场景加载完了,也不会跳转
AsyncOperation.progress;// 这个时表示加载场景的进度。实际上的值时 0 - 0.9, 当值为0.9的时候,场景就已经加载完成了。(可以用来实现加载场景时的进度条)

在使用异步加载时,一般需要使用协程(详情请参考

4.2 代码

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

public class loading : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 异步加载场景
        // 开启协同
        StartCoroutine(Load("Home"));
    }


    /// <summary>
    /// 异步加载场景协程
    /// </summary>
    /// <param name="scenceName">场景名称</param>
    /// <returns></returns>
    IEnumerator Load(string scenceName)
    {
        //等两秒
        yield return new WaitForSeconds(2f);
        AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(scenceName, LoadSceneMode.Single);

        asyncOperation.allowSceneActivation = false;    // 这里限制了跳转


        // 这里就是循环输入进度
        while (asyncOperation.progress < 0.9f)
        {
           // Debug.Log(" progress = " + asyncOperation.progress);
        }

        asyncOperation.allowSceneActivation = true;    // 这里打开限制
        yield return null;

        if (asyncOperation.isDone)
        {
           // Debug.Log("完成加载");
        }
    }
}

5.加载场景的注意事项

5.1 在加载下一个场景前,请将所有的委托解除绑定。

6.参考

(23条消息) unity:加载场景、重新加载本场景,物体是否为显示状态_如果_的博客-CSDN博客_unity重新加载当前场景

(23条消息) Unity的场景加载_SOLA&AIR的博客-CSDN博客_unity3d 加载场景

最后修改:2023 年 11 月 12 日
如果觉得我的文章对你有用,请随意赞赏