Unity 3D で以下のようなAIが作りたい。
- 指定した範囲内をランダムにうろついて
- プレイヤーが認識範囲に入ったら追跡して
- プレイヤーが攻撃範囲に入ったら攻撃する
- ついでにプレイヤーが範囲外に逃げたら追跡を諦める
内容は2Dだがこの動画の解説が非常にわかりやすく、基本的には解説通りにコードを書くだけ。
一部のロジックが動画で説明していない外部クラスで実装されていたので私は以下のように作った。
- 歩行
NavMeshを設定して
NavMeshAgentクラスのdestinationに目的地を代入して移動
navMashAgent.destination = roamPosition
このやり方の利点はNavMeshの範囲内にしかAIが移動できない+障害物があっても回り込んでくれるが、ランダム座標がNavMeshの範囲外を示した場合はいつまでも目的地に到達できずにスタックしてしまうのでランダム座標の生成範囲に注意。
- ランダム座標のDirection
Random.insideUnitCircle.normalized
でxとy軸を合計して最大1になるようなベクトルをランダム生成してくれるが、xとz軸方向に移動してほしいのでyの値をzに代入している。
Vector3 GetRoamingPosition()
{
Vector3 direction = Random.insideUnitCircle.normalized;
direction.z = direction.y;
direction.y = 0f;
return startingPosition + direction * Random.Range(3f, 5f);
}
- 攻撃モーション
シンプルに Animation
クラスの play()
メソッドで制御したかったけどなぜかうまく再生されないので仕方なく Animatior
を利用。
Animator
自体が状態を持ってしまうのがいまいち扱いづらく感じるので再度調査する。
anim = gameObject.GetComponent<Animator>();
anim.Play("TreeAttack");
今後の展望
- このクラスを元に簡単な敵AIを作ってみる
- いろんな種類の敵AIで利用できるような汎用クラスにする
- シンプルで制御しやすいアニメーションの再生方法について調べる