LoginSignup
13
12

More than 5 years have passed since last update.

Unityのフェードのサンプルがわりと間違っている

Last updated at Posted at 2015-06-22

いわゆる単色でのフェードインアウトをUnityで実装するにあたって、ググって見つかるよくある例が OnGUI() 関数で GUI.DrawTexture する、というのが多い。

ここを筆頭に。
http://answers.unity3d.com/questions/341350/how-to-fade-out-a-scene.html

間違いの例

bad
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秒などでフェードが終了してしまうでしょう。
なので

good
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」でググると間違ってるフェードのソースが上位を占めているようなのでこの項を書いてみました。

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12