それでは、シーンの切り替えのときにフェードするトランジション(=シーン切り替え効果)を作ってみましょう。
フェード用カンバスとパネルの作成
今回はuGUIのパネルの透明度を徐々に変えることでフェード効果を実現します。まずはシーンにCanvasを作り、「FadeCanvas」に名前変更してください。そうしたらその子として「Panel」オブジェクトを作ってください(「Create」→「UI」→「Panel」)。
すると画面いっぱいにパネルが表示されます。デフォルトだとこのパネルに画像が設定されていると思いますが、今回は使わないので削除してしまいましょう。さらに、パネルの「Image」コンポーネントの「Color」を開き、R,G,B,Aすべてを「0」にしてください。
ここまでできたらFadeCanvasをプレハブ化し、シーンから削除しましょう。これで下準備ができました。
フェード用カンバスのプログラム
新しいC#スクリプトを作り、名前を「FadeCanvas」に変更してください。これを先ほどのプレハブにアタッチしたら、スクリプトを開いて下のソースコードを記入してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FadeCanvas : MonoBehaviour {
[System.NonSerialized]
public bool fadeIn = false;
[System.NonSerialized]
public bool fadeOut = false;
[SerializeField]
Image panelImage;
[SerializeField]
float fadeSpeed = 0.02f;
float red, green, blue, alpha;
//最初の処理
void Start ()
{
DontDestroyOnLoad(gameObject);
//元の色を取得
red = panelImage.color.r;
green = panelImage.color.g;
blue = panelImage.color.b;
alpha = panelImage.color.a;
}
//毎フレームの処理
void Update ()
{
if (fadeIn)
{
FadeIn();
}
else if (fadeOut)
{
FadeOut();
}
}
//フェードイン
void FadeIn()
{
alpha += fadeSpeed;
SetAlpha();
if(alpha >= 1)
{
fadeIn = false;
}
}
//フェードアウト
void FadeOut()
{
alpha -= fadeSpeed;
SetAlpha();
if(alpha <= 0)
{
fadeOut = false;
Destroy(gameObject);
}
}
//透明度を変更
void SetAlpha()
{
panelImage.color = new Color(red, green, blue, alpha);
}
}
プログラムの解説
最初の処理
FadeCanvasがシーンをまたいでも削除されないようにします。また、パネルの色と不透明度を取得しておきます。
毎フレームの処理
フェードインフラグがONならフェードインメソッドを実行します。それ以外でフェードアウトフラグがONならフェードアウトメソッドを実行します。
フェードイン・フェードアウト
不透明度を足したり引いたりして、色変更を行います。
GameManagerのプログラムの変更
あとはGameManage側でFadeCanvasを生成し、フェードの命令を出すだけです。GameManager.csを下のように書き換えてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
[System.NonSerialized]
public int currentStageNum = 0; //現在のステージ番号(0始まり)
[SerializeField]
string[] stageName; //ステージ名
[SerializeField]
GameObject fadeCanvasPrefab;
[SerializeField]
float fadeWaitTime = 1.0f; //フェード時の待ち時間
GameObject fadeCanvasClone;
FadeCanvas fadeCanvas;
//最初の処理
void Start ()
{
//シーンを切り替えてもこのゲームオブジェクトを削除しないようにする
DontDestroyOnLoad(gameObject);
}
//毎フレームの処理
void Update ()
{
}
//次のステージに進む処理
public void NextStage()
{
currentStageNum += 1;
//コルーチンを実行
StartCoroutine(WaitForLoadScene());
}
//シーンの読み込みと待機を行うコルーチン
IEnumerator WaitForLoadScene()
{
//フェードオブジェクトを生成
fadeCanvasClone = Instantiate(fadeCanvasPrefab);
//コンポーネントを取得
fadeCanvas = fadeCanvasClone.GetComponent<FadeCanvas>();
//フェードインさせる
fadeCanvas.fadeIn = true;
yield return new WaitForSeconds(fadeWaitTime);
//シーンを非同期で読込し、読み込まれるまで待機する
yield return SceneManager.LoadSceneAsync(stageName[currentStageNum]);
//フェードアウトさせる
fadeCanvas.fadeOut = true;
}
//ゲームオーバー処理
public void GameOver()
{
}
}
テストプレイしてフェードイン・フェードアウトが正常に実行されれば成功です!
次のページ→ゲームオーバー処理を作る

