#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 になるのでうまくフェードできます。
もっと効率よくできるものがあったら教えてください。