前言
提示:大体介绍今日功能介绍
本文为了场景太大跳转卡顿所增加一个过度场景
制作
结构介绍
- 本文共有三个场景
- 原本的场景和跳转后的场景增加一个过度时的场景,场景分为有进度条和无进度条版本。
过度场景制作
- 代码直接制作
- 首先我们定义一个固定的场景名字使用的类备用,稍后直接使用
public class AppDefine
{
public static string nextSceneName;
}
- 异步的部分
进度条版本
- 本文选择可以直接选择添加一个可视化的进度条版本
- 本场景名为AsyncLoadScene
public Slider loadingSlider; //加载场景进度条,B场景中使用UGUI实现
public Text loadingText; //显示加载进度 %
private float loadingSpeed = 1; //加载速度,这里是进度条的读取速度
private float targetValue; //进度条目标的值/异步加载进度的值
private float operation = 3.0f;
private AsyncOperation asyncLoad; //定义异步加载的引用
// Use this for initialization
void Start()
{
//loadingSlider.value = 0.0f; //初始化进度条
if (SceneManager.GetActiveScene().name == "AsyncLoadScene") //如果当前活动场景是B
{
//启动协程
StartCoroutine(AsyncLoading()); //开启协程进行异步加载
}
}
IEnumerator AsyncLoading()
{
asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
//阻止当加载完成自动切换
asyncLoad.allowSceneActivation = false;
yield return null;
} // 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;
}
}
观赏版本
- 这个版本可以把异步场景制作为一个相对好看,或者带我们本场景的logo展示等场景
- 场景不建议过于太大
private float loadingSpeed = 1; //加载速度,这里是进度条的读取速度
private float targetValue; //进度条目标的值/异步加载进度的值
private float operation = 3.0f;
private AsyncOperation asyncLoad; //定义异步加载的引用
// Use this for initialization
void Start()
{
//loadingSlider.value = 0.0f; //初始化进度条
if (SceneManager.GetActiveScene().name == "AsyncLoadScene") //如果当前活动场景是B
{
//启动协程
StartCoroutine(AsyncLoading()); //开启协程进行异步加载
}
}
IEnumerator AsyncLoading()
{
asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
//阻止当加载完成自动切换
asyncLoad.allowSceneActivation = false;
yield return null;
} // Update is called once per frame
void Update()
{
targetValue = asyncLoad.progress;
if (asyncLoad.progress >= 0.9f)
{
//progress的值最大为0.9
targetValue = 1.0f;
}
asyncLoad.allowSceneActivation = true;
}
使用方法
- 使用方法非常简单
- 我们直接首先控制我们创建的单独的类AppDefine中的下一个场景需要跳转的场景修改
- 然后按照我们正常使用的跳转即可
- 因为我们的异步场景并不是很大,所以会跳转的非常快
public void LoadNewScene()
{
//保存需要加载的目标场景
AppDefine.nextSceneName = "原本需要跳转的相对较大的场景";
SceneManager.LoadScene("AsyncLoadScene");
}
结果
最后就是我们可以使用某种介质控制我们开始跳转,跳转到我们的异步的过度场景,在场景中等待时间,等待我们的Unity把第三个场景加载完成,则即可跳转过去。