同步加载:Application.LoadLevel()
异步加载:Application.LoadLevelAsync()
我们在加载场景时,利用loading场景非常小的特点,先同步加载Loading场景,在加载的同时,将真正要加载的场景名称作为一个参数传入一个全局变量(可以用单例或静态变量来实现)中保存起来,然后loading场景加载后,立即获取这个变量,立即开始加载真正要加载的场景,并事实显示加载进度。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadingScene : MonoBehaviour
{
// 先声明一个静态字符串变量来保存要加载的场景的名称;
public static string LoadingName;
//引用UI组件
public UISlider slider;
public UILabel label;
//声明一个异步进度变量
AsyncOperation asyn;
void Start()
{
if(slider == null)
{
Debug.Log("进度条组件丢失");
}
if(label == null)
{
Debug.Log("进度显示文字丢失");
}
//进入这个场景就立即协程加载新场景
StartCoroutine("BeginLoading");
}
// Update is called once per frame
void Update()
{
//更新UI
slider.value = asyn.progress;
label.text = "加载进度:[FF0000]" + (slider.value * 100).ToString(".00" + "%");
}
//加载目标场景的函数
IEnumerator BeginLoading()
{
asyn = Application.LoadLevelAsync(LoadingName);
yield return asyn;
}
//设计一个封装好的静态函数
public static void LoadNewScene(string value)
{
LoadingName = value;
Application.LoadLevel("LoadingScene");
}
}
在代码中,我们可以看到,声明了一个静态变量LoadingName来保存要加载的目标场景的名称,然后封装了一个静态函数LoadNewScene()来供切换场景时调用。
如果需要切换场景B, 我们就调用
LoadingScene.LoadNewScene("B");
然后的逻辑是立即将B保存到静态变量LoadingName中,并加载Loading场景,当Loading场景被加载进来之后,在Start函数中就开启了一个协同程序去执行BeginLoading方法并加载目标场景,同时返回asyn异步实例,然后再利用asyn在Update中实时更新UI信息。
当异步的进度达到100%之后,就相当于后台进行加载完成,程序会自动切换场景到目标场景中。