#1 - unityでフェード処理を効率よく見やすくする | 駆け出しゲームプログラマーの備忘録

前提としてUnityで使われている透明度( Color.a )は 0~1 の数値で決められており、0が完全に透明の状態。
下記コードのFade()メソッドを自身のUpdateや親オブジェクトに更新してもらうことでフェードします。
enumとかで状態分けをした方がわかりやすくて管理しやすいと思う。


■画像やテキストを徐々に透明にしていきたい場合

    /// <summary>
    /// フェード進捗度カウント
    /// </summary>
    private float count = 0.0f;

    /// <summary>
    /// 何秒かけてフェードしていくか
    /// </summary>
    private readonly float time = 2.0f;

    /// <summary>
    /// フェード
    /// </summary>
    private void Fade()
    {
        this.count += Time.deltaTime / this.time;

        float alpha = Mathf.Lerp( 1 , 0 , Mathf.Clamp(this.count , 0 , 1 ) );

        if( this.count >= 1.0f )
        {
            // フェード終わり
        }

        ○○.SetAlpha( alpha ); 
    }

逆に徐々にalpha値を上げていきたい場合は、Mathf.Lerp( 1 , 0 , ~~ ) の1と0の位置を入れ替えるだけでok


■ 一度だけ透明になってから再度出現させたい場合

    /// <summary>
    /// フェード進捗度カウント
    /// </summary>
    private float count = 0.0f;

    /// <summary>
    /// 何秒かけてフェードしていくか
    /// </summary>
    private readonly float time = 2.0f;

    /// <summary>
    /// フェード
    /// </summary>
    private void Fade()
    {
        this.count += Time.deltaTime / this.time;

        float alpha = Mathf.Cos( Mathf.Clamp( this.count , 0 , 1 ) * 360 * Mathf.Deg2Rad ) / 2 + 0.5f;

        if( this.count >= 1.0f )
        {
            // フェード終わり
        }

        〇〇.SetAlpha( alpha );
    }

this.countは0~1で制限されていて、*360にすることでフェードが終わるまでにCosが一周するようになります。
その値を /2 することで cosの値を 0.5~-0.5に制限、そこに +0.5fすることでcosの値は 1~0 になるのでうまくフェードできます。


もっと効率よくできるものがあったら教えてください。