おもちゃラボ

Unityで遊びを作ってます

【Unity】Animation Curveを使ってインスペクタからレベルデザインをする

Animation Curveとはベジェ曲線を使って物体の動きや挙動などをGUIで設定するための仕組みです。
Unityではスクリプトで定義したAnimation Curveをインスペクタに表示することができます。そこで、このアニメーションカーブを使ってレベルデザインをしちゃおう!というのがこの記事の内容です。

インスペクタからAnimation Curveを設定する

ここでは、簡単なシューティングゲームを考えてみます。敵が弾を打つ間隔をアニメーションカーブで制御してみましょう。

f:id:nn_hokuson:20170323200918p:plain:w400

早速ですが、敵クラスのプログラムは次のようになります。

public class EnemyController : MonoBehaviour 
{
    public GameObject bulletPrefab;
    public AnimationCurve waitTime;

    IEnumerator Generate()
    {
        while (true)
        {
            Instantiate (bulletPrefab);
            float wait = this.waitTime.Evaluate (Time.time);
            yield return new WaitForSeconds (wait);
        }
    }
            
    void Start () {
        StartCoroutine (Generate ());
    }
}

スクリプト中にpublic変数としてAnimation Curveを宣言しています。
Animation Curveクラスはグラフのようなもので、縦軸と横軸の定義は自由に決めてOKです。今回は縦軸に弾を打つ間隔、横軸にゲーム時間を表すグラフを作成します。

Animation Curve変数はpublic変数として宣言しているので、インスペクタを見るとアニメーションカーブの欄が表示されています。
この欄をダブルクリックしてAnimation Windowを開き、次のような曲線を作成しました。

f:id:nn_hokuson:20170323200251p:plain:w400

最初は弾を打つ間隔を大きく取り、時間が立つに連れて弾を打つ間隔を短くしています。最後はご褒美で少しだけ簡単にしています。今回は分かりやすいように、横軸は5秒で設定・・・(笑)

レベルデザインの方法については「Unity5の教科書」にも書いたので合わせて参考にしてください!

また、設定した時間外のグラフをどのように扱うのかは、カーブ終端の歯車ボタンで設定できます。
設定できる種類は次の3種類です。

  • Loop
  • PingPong
  • Clamp

[Loop]アニメーションカーブを1から繰り返します。
f:id:nn_hokuson:20170323200323p:plain:w300
[PingPong] グラフ終端で線対称になるようにグラフが生成されます
f:id:nn_hokuson:20170323200330p:plain:w300
[Clamp] グラフ終端の値が使われます。
f:id:nn_hokuson:20170323200336p:plain:w300

Animation Curveから値を取り出す

スクリプトに戻って、現在時刻から弾の時間間隔を取り出す部分を見ていきましょう。アニメーションカーブのX軸の値からY軸の値を得るためにはEvaluateメソッドを使います。

Evaluateメソッドの引数にX軸の値を渡すことで、Y軸の値が取得できます。ここではX軸の値としてゲーム開始からの時間を渡して、返り値として次の弾を発射するまでの待ち時間を取得しています。

f:id:nn_hokuson:20170323200407p:plain:w400

取り出した待ち時間ぶん、waitForSecondsメソッドを使って弾の生成を停止しています。

これでアニメーションカーブを使ったレベル設定ができました。
実行結果は次のようになりました。レベルデザインどおりに時間とともに弾を打つ間隔が変わっていますね〜^^

f:id:nn_hokuson:20170323200414g:plain