Unity異步跳轉
- 前言
- 制作
-
- 結構介紹
- 過度場景制作
-
- 進度條版本
- 觀賞版本
- 使用方法
- 結果
前言
提示:大體介紹今日功能介紹
本文為了場景太大跳轉卡頓所增加一個過度場景
制作
結構介紹
- 本文共有三個場景
- 原本的場景和跳轉後的場景增加一個過度時的場景,場景分為有進度條和無進度條版本。
過度場景制作
- 代碼直接制作
- 首先我們定義一個固定的場景名字使用的類備用,稍後直接使用
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把第三個場景加載完成,則即可跳轉過去。