1.什么是异步加载场景?
异步加载场景:顾名思义就是不影响当前游戏场景的运行的前提下加载新的场景。
其方法如下:
第一种加载方案:
Application.LoadLevelAsync("LoadScene");//销毁原场景
第二种加载方案:
Application.LoadLevelAdditiveAsync("loadScene");//不销毁原场景
以上两种方案已经过时目前本文所提及的是第三种方案:
UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(nextSceneName);
2.为什么要异步加载场景
当我们执行场景跳转的时候,经常会出现游戏顿的情况,为了过度掉这段卡顿的情况,我们可以在创建一个新的场景,专门用来加载将要跳转的下一个场景。通常情况下这个新创建的场景是用来加载下一个即将跳转的场景的,一般使用异步加载。
3. 异步加载场景的实现
通过将场景分为A、B、C三个场景,A场景开始;B场景诗加载场景;C场景是目标场景;
首先定义一个公共信息类,在类中定义一个静态变量用于存储需要加载的场景名字。
public class AppDefine
{
public static string nextSceneName;
}
然后在A场景中添加代码触发场景切换:
//异步加载新场景
public void LoadNewScene()
{
//保存需要加载的目标场景
Appdefine.nextSceneName = "C";
SceneManager.LoadScene("B");
}
最后在B场景中添加脚本挂在Camera下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider; //加载场景进度条,B场景中使用UGUI实现
public Text loadingText; //显示加载进度 %
private float loadingSpeed = 1; //加载速度,这里是进度条的读取速度
private float targetValue; //进度条目标的值/异步加载进度的值
private AsyncOperation asyncLoad; //定义异步加载的引用
// Use this for initialization
void Start ()
{
loadingSlider.value = 0.0f; //初始化进度条
if (SceneManager.GetActiveScene().name == "B") //如果当前活动场景是B
{
//启动协程
StartCoroutine(AsyncLoading()); //开启协程进行异步加载
}
}
IEnumerator AsyncLoading()
{
asyncLoad = SceneManager.LoadSceneAsync(Globe.nextSceneName);
//阻止当加载完成自动切换
asyncLoad.allowSceneActivation = false;
yield return operation;
} // Update is called once per frame
void Update()
{
targetValue = asyncLoad.progress;
if (asyncLoad.progress >= 0.9f)
{
//progress的值最大为0.9
targetValue = 1.0f;
}
if (targetValue != loadingSlider.value)
{ //插值运算
loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);
if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)
//如果当前进度条value和目标值接近 设置进度条value为目标值
{ loadingSlider.value = targetValue; }
}
loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%"; if ((int)(loadingSlider.value * 100) == 100)
//当进度条读取到百分之百时允许场景切换
{ //允许异步加载完毕后自动切换场景
asyncLoad.allowSceneActivation = true;
}
}
}
本文详细介绍了Unity异步加载场景的原理和实现方法,旨在解决场景切换时的卡顿问题。通过创建加载场景B,异步加载目标场景C,确保游戏流程的平滑过渡。
2347

被折叠的 条评论
为什么被折叠?



