Unityシーン間のフェード効果をたった2行で実現する方法

Unityのシーン遷移時に、指定した時間と色でフェードインアウトする簡単なスクリプトをつくってみた。

以下のFadeManager.csをプロジェクトに組み込んでおけば、ほかのスクリプトからわずか2行でコントロールできる。

コピペですぐ使えるよ

ソースコード

//FadeManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class FadeManager:MonoBehaviour{

    //フェード用のCanvasとImage
    private static Canvas fadeCanvas;
    private static Image fadeImage;

    //フェード用Imageの透明度
    private static float alpha = 0.0f;

    //フェードインアウトのフラグ
    public static bool isFadeIn = false;
    public static bool isFadeOut = false;

    //フェードしたい時間(単位は秒)
    private static float fadeTime = 0.2f;

    //遷移先のシーン番号
    private static int nextScene = 1;

    //フェード用のCanvasとImage生成
    static void Init()
    {
        //フェード用のCanvas生成
        GameObject FadeCanvasObject = new GameObject("CanvasFade");
        fadeCanvas = FadeCanvasObject.AddComponent<Canvas>();
        FadeCanvasObject.AddComponent<GraphicRaycaster>();
        fadeCanvas.renderMode = RenderMode.ScreenSpaceOverlay;
        FadeCanvasObject.AddComponent<FadeManager>();

        //最前面になるよう適当なソートオーダー設定
        fadeCanvas.sortingOrder = 100;

        //フェード用のImage生成
        fadeImage = new GameObject("ImageFade").AddComponent<Image>();
        fadeImage.transform.SetParent(fadeCanvas.transform, false);
        fadeImage.rectTransform.anchoredPosition = Vector3.zero;

        //Imageサイズは適当に大きく設定してください
        fadeImage.rectTransform.sizeDelta = new Vector2(9999, 9999);
    }

    //フェードイン開始
    public static void FadeIn()
    {
        if (fadeImage == null) Init();
        fadeImage.color = Color.black;
        isFadeIn = true;
    } 

    //フェードアウト開始
    public static void FadeOut(int n)
    {
        if (fadeImage == null) Init();
        nextScene = n;
        fadeImage.color = Color.clear;
        fadeCanvas.enabled = true;
        isFadeOut = true;
    }

    void Update()
    {
        //フラグ有効なら毎フレームフェードイン/アウト処理
        if (isFadeIn)
        {
            //経過時間から透明度計算
            alpha -= Time.deltaTime / fadeTime;

            //フェードイン終了判定
            if (alpha <= 0.0f)
            {
                isFadeIn = false;
                alpha = 0.0f;
                fadeCanvas.enabled = false; 
            }

            //フェード用Imageの色・透明度設定
            fadeImage.color = new Color(0.0f, 0.0f, 0.0f, alpha);
        }
        else if (isFadeOut)
        {
            //経過時間から透明度計算
            alpha += Time.deltaTime / fadeTime;

            //フェードアウト終了判定
            if (alpha >= 1.0f)
            {
                isFadeOut = false;
                alpha = 1.0f;

                //次のシーンへ遷移
                SceneManager.LoadScene(nextScene);
            }

            //フェード用Imageの色・透明度設定
            fadeImage.color = new Color(0.0f, 0.0f, 0.0f, alpha);
        }
    }
}

Unityバージョン2018.1.4f1で動作確認済み。

使い方

上記のコードをコピペしてFadeManager.csというファイルをつくり、Unityのアセットに読み込んでおく。

FadeManager

特定のシーンをフェードインで始めたい場合、そのシーンのStart()内に以下の1行を追加する。

FadeManager.FadeIn();

現在のシーンをフェードアウトで終わって、次のシーンにフェードインしたい場合、任意のタイミングで次の1行を実行する。

FadeManager.FadeOut(/*遷移したいシーン番号*/);

簡単にフェードイン/アウトするだけなら、この2行で制御可能。それぞれ単独でも使用できる(フェードインせずに始めたシーンでもフェードアウト可能)。

上記FadeIn()とFadeOut()はともにpublic staticな関数なので、FadeManagerクラスからインスタンス生成せずに直接呼び出せる。

ここから先は個人的な開発メモです。

タイトルとURLをコピーしました