1217 パワーゲージを動かそう! - mishimatsu/AdventCalendar2014 GitHub Wiki

前回は、テクスチャでパワーゲージを表示しました。 今回は、パワーゲージの長さを変えるアニメーションを行いたいと思います。 いつものように、Unityを起動します。 今回もスクリプトを利用するので、BallスクリプトをダブルクリックしてMonoDevelopを起動します。 今回作成するパワーゲージの長さを変えるアニメーションを実現するために必要なことを考えてみましょう。 1.パワーゲージの長さの変更 2.経過時間の取得 最低限、この2つが必要なようです。 順番に見ていきましょう。 1.パワーゲージの長さの変更 これは、パワーゲージを描画する際の横幅を設定すれば変更できそうです。 GUI.DrawTexture()には、第一引数にRectを与えるので、このRectの幅を変更することで対応できそうです。 2.経過時間の取得 これがなぜ必要かというと、パワーゲージは、時間が経過すると徐々に伸びていくはずです。 そのために、前の処理からどれくらい時間が経過したかを知る必要があります。 経過時間を取得するには、Time.deltaTimeを使います。 Time.deltaTimeは、前回の処理からの経過時間を返します。 Time.deltaTimeの単位は、ミリ秒になります。 1秒は、1000ミリ秒です。 これで、パワーゲージをアニメーションさせるためのパーツが揃いました。 スクリプトを書いてみましょう。 今回は、少しスクリプトの量が増えました。 順番に見ていきましょう。 7行目 private float totalTime; これは、経過時間の合計を保存しておく変数です。 privateのキーワードが出てきました。 これは、このクラス内でのみ参照可能という意味になります。 8行目 private float gaugeWidth; 現在のパワーゲージの幅を保存しておく変数です。 パワーゲージの幅の最大値と経過時間から求めた幅データを保持しておきます。 9行目 public float gaugeMaxWidth = 256.0f; パワーゲージの幅の最大値を保存しておく変数です。 Unity側から横幅を調整したいので、publicにしてあります。 256.0fがついていますが、横幅の初期値を256.0fするという意味です。 今回の変数の定義は、この3つのみになります。 続いて、パワーゲージの幅を求める処理について解説します。 経過時間を加算する 17行目 totalTime += Time.deltaTime; totalTimeにTime.deltaTimeつまり、前回からの経過時間を足し合わせる処理になります。 +=の演算子は、totalTime = totalTime + Time.deltaTimeという意味で、加算して代入する演算子になります。 totalTime = totalTime + Time.deltaTime;と書いても問題ないのですが、totalTime += Time.deltaTime;と記述したほうが簡潔に書け、タイプ量も少ないのでよく使われます。 +演算子の説明が抜けていましたね。 +演算子は、数学と同様に加算を表す演算子です。 19行目 gaugeWidth = gaugeMaxWidth * totalTime; パワーゲージの幅の最大値と経過時間の合計を掛けあわせて、表示するパワーゲージの幅を求めています。 経過時間が0の場合には、パワーゲージの幅が0になり、 経過時間が1に近づくと、パワーゲージの幅がgaugeMaxWidthの値に近づいていきます。 今回の場合、gaugeMaxWidthの値は、256.0なので、256.0に近づくことになります。 32行目 GUI.DrawTexture(new Rect(10, 10, gaugeWidth, 32), gauge); 変更前 GUI.DrawTexture(new Rect(10, 10, 256, 32), gauge); 変更後 GUI.DrawTexture(new Rect(10, 10, gaugeWidth, 32), gauge); 定数の256がgaugeWidthに変更になっています。 Rectの幅のパラメータを定数から変数へ変更したことで、パワーゲージの幅を自由に変えられるようになりました。 実行してみよう! ・・・ パワーゲージが指定した幅を越えて、画面の端まで描画されてしまいました。 原因は、totalTimeが1.0で折り返されないのが原因のようです。 例:totalTimeが2.0になった場合には、2.0 x 256.0 = 512となってしまいます。 totalTimeが1.0より大きくなったら0に戻す処理を追加しましょう。 Mathf.Repeat()関数を使います。 18行目 totalTime = Mathf.Repeat(totalTime, 1.0f); これで、totalTimeは、0.0から1.0の間の値で繰り返します。 例えば、1.0の値を50.0に変更すると、totalTimeの値は、0.0から50.0の間の値で繰り返します。 実行してみましょう。 少しパワーゲージのスピードが遅いようです。 スピードをUnity上から調整できるようにしましょう。 10行目 public float gaugeSpeed = 1.0f; gaugeSpeedをUnity上から調整できるようにpublicのメンバー変数にしてあります。 19行目 totalTime += Time.deltaTime * gaugeSpeed; 追加したgaugeSpeedの変数を掛けることで、進める時間を速めています。 追加したgaugeSpeedは、BallのInspectorで確認できます。 実行してみましょう。 実行中にパワーゲージのスピードを変更することも可能です。 値を変更して、パワーゲージの変化を確認してみましょう。 練習問題 パワーゲージの表示位置をUnityのInspectorから設定できるように、スクリプトを変更してみましょう。 次回は、パワーゲージの値に応じて、ボールを投げるスピードを変化させたいと思います。 それでは、楽しいUnity Lifeを! 参考文献 Mathf.Repeat