いわゆる単色でのフェードインアウトをUnityで実装するにあたって、ググって見つかるよくある例が OnGUI() 関数で GUI.DrawTexture する、というのが多い。
ここを筆頭に。
http://answers.unity3d.com/questions/341350/how-to-fade-out-a-scene.html
間違いの例
private Texture2D _fadeTex;
private float _alpha;
void Start()
{
_fadeTex = new Texture2D(1,1,TextureFormat.RGBA32,false);
}
void OnGUI()
{
_alpha = fadeDir * fadeSpeed * Time.deltaTime;
GUI.color.a = _alpha;
Graphics.DrawTexture( screenRect, _fadeTex );
}
上記ソースはいろいろ端折っちゃったのですが、何が間違いかというと「OnGUIとTime.deltaTimeに因果関係が無いのでOnGUI内でTime.deltaTimeを使った計算をしてはいけない」ということです。
OnGUIはUpdateと同じ回数コールされるわけではありません。Updateが1回コールされるあいだに、2回3回とOnGUIが実行されることがあります。
ですので、1秒でフェードアウトするようなソースを書いたとしてもほぼ1秒未満、下手すると0.3秒などでフェードが終了してしまうでしょう。
なので
void Update()
{
_alpha = fadeDir * fadeSpeed * Time.deltaTime;
}
void OnGUI()
{
GUI.color.a = _alpha;
Graphics.DrawTexture( screenRect, _fadeTex );
}
と、Updateの中でフェードの度合いは更新してあげる必要があります。
または、こんなのでもいいのかもしれません。
void OnGUI()
{
if (Event.current.type == EventType.Repaint)
{
_alpha = fadeDir * fadeSpeed * Time.deltaTime;
GUI.color.a = _alpha;
Graphics.DrawTexture( screenRect, _fadeTex );
}
}
EventType.RepaintとしてOnGUIがコールされる間隔がTime.deltaTimeと一致するのか、マニュアルを読んでもいまいち確信が持てないのであんまりお勧めしないです...(というか自信が無い。調べてもいなくて恐縮です。)
http://docs.unity3d.com/ScriptReference/EventType.Repaint.html
本家のチュートリアルはそのあたりを正しく押さえたソースになっています。
https://unity3d.com/learn/tutorials/projects/stealth/screen-fader
しかし、「Unity fade」でググると間違ってるフェードのソースが上位を占めているようなのでこの項を書いてみました。