序文
提示:大体介绍今日功能介绍
この記事では、シーンが大きすぎてジャンプやフリーズができないため、トランジション シーンを追加します。
作る
構造の紹介
- この記事には 3 つのシナリオがあります
- オリジナルシーンとジャンプ後のシーンにトランジションシーンが追加され、プログレスバーありバージョンとプログレスバーなしバージョンに分かれています。
過剰なシーン演出
- コードの直接制作
- まず、固定のシーン名を持つクラスを予備として定義します。これは後で直接使用されます。
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;
}
}
時計のバージョン
- このバージョンでは、非同期シーンを比較的見栄えの良いシーンにしたり、自分のシーンと他のシーンのロゴを表示したりできます。
- シーンが大きすぎることはお勧めしません
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 が 3 番目のシーンの読み込みを完了するのを待ってから、過去にジャンプするように制御できます。