こちらのサイト様を参考にuGUI版フェードイン/アウトを作成した。
また、シングルトンについてもこちらのものをそのまま使用させて頂いている。
〇コード
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class FadeManager : SingletonMonoBehaviour<FadeManager>
{
GameObject black;//暗転用のオブジェクト
float time = 0.1f;//頻繁に使用するつもりのフェードイン/アウトの時間
public void Awake()
{
if (this != Instance)
{
Destroy(this);
return;
}
DontDestroyOnLoad(this.gameObject);
}
//秒数を指定したいときはこちらを呼び出す
public void LoadLevel(string scene, float interval)
{
StartCoroutine(TransScene(scene, interval));
}
//timeの秒数を利用するとき
public void LoadLevel(string scene)
{
StartCoroutine(TransScene(scene, time));
}
private IEnumerator TransScene(string scene, float interval)
{
float time = 0;
RawImage raw = SetFadeObject();
while (time <= interval)
{
raw.color = new Color(0, 0, 0, Mathf.Lerp(0f, 1f, time / interval));
time += Time.deltaTime;
yield return 0;
}
Application.LoadLevel(scene);
//名前が変わる=シーンが変わるのを待つ
while(Application.loadedLevelName != scene) yield return 0;
time = 0;
//LoadLevelでCanvasが一度破棄されているはずなのでもう一度呼び出す
raw = SetFadeObject();
while (time <= interval)
{
raw.color = new Color(0, 0, 0, Mathf.Lerp(1f, 0f, time / interval));
time += Time.deltaTime;
yield return 0;
}
Destroy(black);
}
//暗転用オブジェクトを生成し、透明度を変更するためRawImageを返す
RawImage SetFadeObject()
{
black = new GameObject();
black.name = "FadeObject";
//Canvasの名前やヒエラルキーを変更している場合は要修正
black.transform.SetParent(GameObject.Find("/Canvas").transform);
RectTransform rect = black.AddComponent<RectTransform>();
rect.anchorMax = new Vector2(1f, 1f);
rect.anchorMin = new Vector2(0f, 0f);
rect.anchoredPosition = new Vector2(0, 0);
return black.AddComponent<RawImage>();
}
}
〇余談
参考にさせて頂いたサイト様のスクリプトは、実行した際にエディタがほぼハングアップの状態になってしまった(×閉じるなどはできる)。
とりあえずthis.blackTexture.ReadPixels (new Rect (0, 0, 32, 32), 0, 0, false);のRectをRect(0,0,1,1)などに書き換えることで動作したのだが、
uGUI以前のGUIについては知識がほとんどないので、ここが本当に原因なのかもわかっていない。
現状ではフェード中にも操作できてしまうので、
フェードの始まりに入力受付OFF、フェードの終わりに入力受付ONというような実装が必要になるだろう。