unity教程:加載場景時(shí)過場界面實(shí)現(xiàn)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class UIManager : MonoBehaviour
{
public CanvasGroup UI;
private void Awake()
{
UI = FindObjectOfType<CanvasGroup>();
}
private void OnEnable()
{
SceneSwitchEventHandler.SwitchScenes += OnSwitchScenes;
}
private void OnDisable()
{
SceneSwitchEventHandler.SwitchScenes += OnSwitchScenes;
}
/// <summary>
/// 訂閱(場景切換)
/// </summary>
/// <param name="targetScene">目標(biāo)場景</param>
private void OnSwitchScenes(string targetScene)
{
StartCoroutine(SwitchScenes(targetScene));
}
/// <summary>
/// 切換場景方法
/// </summary>
/// <param name="targetScene">目標(biāo)場景</param>
private IEnumerator SwitchScenes(string targetScene)
{
//將加載顯示UI界面優(yōu)先級調(diào)高于其他場景的UI界面
UI.GetComponentInParent<Canvas>().sortingOrder = 1;
//調(diào)用方法 將加載顯示UI界面的透明度逐漸調(diào)高至完全不透明
yield return Fade(1);
//關(guān)閉當(dāng)前激活的場景 (異步)
yield return SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
//加載需要的場景并設(shè)置為激活
yield return LoadSceneSetActive(targetScene);
//調(diào)用方法 將加載顯示UI界面的透明度逐漸調(diào)低至完全透明
yield return Fade(0);
//恢復(fù)加載顯示UI界面的優(yōu)先級
UI.GetComponentInParent<Canvas>().sortingOrder = -1;
}
/// <summary>
/// 加載場景并設(shè)置為激活
/// </summary>
/// <param name="sceneName">場景名</param>
/// <returns></returns>
private IEnumerator LoadSceneSetActive(string sceneName)
{
yield return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
Scene newScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
SceneManager.SetActiveScene(newScene);
}
/// <summary>
/// 逐漸修改UI界面的透明度
/// </summary>
/// <param name="targetAlpha">修改值</param>
/// <returns></returns>
private IEnumerator Fade(float targetAlpha)
{
UI.blocksRaycasts = true;
float speed = Mathf.Abs(UI.alpha - targetAlpha) / 1.5f;
while (!Mathf.Approximately(UI.alpha, targetAlpha))
{
UI.alpha = Mathf.MoveTowards(UI.alpha, targetAlpha, speed * Time.deltaTime);
yield return null;
}
UI.blocksRaycasts = false;
}
}
using UnityEngine;
public class LoadScene : MonoBehaviour
{
/// <summary>
/// 加載場景
/// </summary>
/// <param name="sceneName">加載場景名字</param>
public void SwitchScene(string sceneName)
{
SceneSwitchEventHandler.CallSwitchScenes(sceneName);
}
}
using System;
public static class SceneSwitchEventHandler
{
/// <summary>
/// 事件(切換場景時(shí)調(diào)用)
/// </summary>
public static Action<string> SwitchScenes;
/// <summary>
/// 調(diào)用事件
/// </summary>
/// <param name="targetScene">目標(biāo)場景</param>
public static void CallSwitchScenes(string targetScene)
{
SwitchScenes?.Invoke(targetScene);
}
}