Unity同步加载和异步加载场景
1.同步加载场景与异步加载场景
同步加载场景顾名思义,加载场景这个步骤与当前场景共用一个逻辑线程,也就是说,在加载场景时,原场景的逻辑将等待场景的加载,如果加载的场景过大,就会造成卡顿。
异步加载场景顾名思义,加载场景这个步骤将与当前场景不属于同一线程,在加载场景时,原场景的逻辑并不会等待场景的加载,也就不会有卡顿。(一般推荐使用异步加载)
2.加载场景前的准备工作
2.1 将需要加载的场景导入SceneInBuild,直接把project面板中的场景文件直接拖入即可
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重新加载当前场景