🌒
【Unity】フェードアウト後にシーン遷移する方法
今回はUnityでフェードアウトして、その後他のシーンに遷移する方法を紹介していきます。
実装するのはこんな感じ↓
フェードアウトしてシーン遷移しています。
今回紹介する方法の良い所
・Time.deltaTimeを使っているのでフレームに左右されない。
・表示しているUIとシーン内容まとめてフェードアウトできる。
よく紹介される「SimpleFadeSceneTransitionSystem」アセットは、フェードアウトできますがUIには反映されません。なので自身でCanvasでImageを作って、フェードアウトさせる方法が良さげです。
手順
-
まずCanvasとPanelのUIを追加します。
-
PanelのImageコンポーネントのColorのRGBAを全部0にします。
-
PnaelのImageを無効にしておきます。(無効にしないとUIのボタンが押せないため)
-
以下のFadeSceneLoaderというスクリプトを作成します。
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class FadeSceneLoader : MonoBehaviour
{
public Image fadePanel; // フェード用のUIパネル(Image)
public float fadeDuration = 1.0f; // フェードの完了にかかる時間
private void Start()
{
StartCoroutine(FadeOutAndLoadScene());
}
public IEnumerator FadeOutAndLoadScene()
{
fadePanel.enabled = true; // パネルを有効化
float elapsedTime = 0.0f; // 経過時間を初期化
Color startColor = fadePanel.color; // フェードパネルの開始色を取得
Color endColor = new Color(startColor.r, startColor.g, startColor.b, 1.0f); // フェードパネルの最終色を設定
// フェードアウトアニメーションを実行
while (elapsedTime < fadeDuration)
{
elapsedTime += Time.deltaTime; // 経過時間を増やす
float t = Mathf.Clamp01(elapsedTime / fadeDuration); // フェードの進行度を計算
fadePanel.color = Color.Lerp(startColor, endColor, t); // パネルの色を変更してフェードアウト
yield return null; // 1フレーム待機
}
fadePanel.color = endColor; // フェードが完了したら最終色に設定
SceneManager.LoadScene("Menu"); // シーンをロードしてメニューシーンに遷移
}
}
- 作成したらCanvasにスクリプトをアタッチします。変数のFadePanelに子のPanelをドラッグで追加しておきます。
完成です。上記のスクリプトではStart()で呼び出していますが、下記のスクリプトでは任意タイミングで実行できます。
他スクリプトから任意のタイミングで実行する場合のスクリプト
他スクリプトから任意のタイミングで実行する場合、スクリプトを以下に変更してください。
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class FadeSceneLoader : MonoBehaviour
{
public Image fadePanel;
public float fadeDuration = 1.0f;
//追加した部分
public void CallCoroutine()
{
StartCoroutine(FadeOutAndLoadScene());
}
public IEnumerator FadeOutAndLoadScene()
{
fadePanel.enabled = true; // パネルを有効化
float elapsedTime = 0.0f; // 経過時間を初期化
Color startColor = fadePanel.color; // フェードパネルの開始色を取得
Color endColor = new Color(startColor.r, startColor.g, startColor.b, 1.0f); // フェードパネルの最終色を設定
// フェードアウトアニメーションを実行
while (elapsedTime < fadeDuration)
{
elapsedTime += Time.deltaTime; // 経過時間を増やす
float t = Mathf.Clamp01(elapsedTime / fadeDuration); // フェードの進行度を計算
fadePanel.color = Color.Lerp(startColor, endColor, t); // パネルの色を変更してフェードアウト
yield return null; // 1フレーム待機
}
fadePanel.color = endColor; // フェードが完了したら最終色に設定
SceneManager.LoadScene("Menu"); // シーンをロードしてメニューシーンに遷移
}
}
以下のように呼び出します。
public FadeSceneLoader fadeSceneLoader;
public void GameOver()
{
fadeSceneLoader.CallCoroutine();
}
以上です。
Discussion