先日 Unity の Navigation 機能について説明を求められる機会がありました。私自身、基本的に Navigation を利用するようなゲームを作らないので、 Navigation に関してはあまり触れたことがなく...。軽く触ってみたら、爆速で簡単な移動AIができて圧巻!ということで記事にしてみました。
[この記事の対象者]
・Unity初級〜中級者
[この記事の目的]
・爆速で簡単な移動AIを作ろう
それでは始めていきましょう!
ステージの作成
まずステージがないと始まらないのでステージを簡単に作っておきます。
今回はこんな感じ。
青が player 、赤が target となるオブジェクトです。
自動追従するAIの作成
青の player が赤の target まで、道に沿って移動するAI機能を作成します。
[操作]
- player(自動で動かしたいもの)に Nav Mesh Agent という Component をアタッチします。
- 次に、 Navigation ウィンドウで地形を Bake します。
- スクリプトを書きます。
- player オブジェクトにスクリプトをアタッチして、 Inspector から player, target にそれぞれ対応するオブジェクトを入れます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlayerMove : MonoBehaviour {
public NavMeshAgent player;
public GameObject target;
void Start () {
player = gameObject.GetComponent<NavMeshAgent>();
}
void Update () {
if (target != null) {
player.destination = target.transform.position;
}
}
}
はい、これで自動追従AIの作成終了です!簡単!
できた!と思いきや...
Bake し忘れたかなー、と思ってもう一度 Bake して再生しても変わらず...
調べてみたら、どうやら通路や壁として使うオブジェクトは Static にチェック入れないとだめなんですね。Terrain はデフォルトで Static になってるので気づきませんでした。
[操作]
- ステージに使用しているオブジェクト(床 Plane , 壁 Cube )全てを Static に設定
- 再度 Bake する
再生すると、ちゃんと通路に沿って player が target を追いかけています。
こんなに簡単に作れちゃうんですね!
障害物を避けて移動するAIの作成
さて続いて、次のステップに進みましょう。
ステージの形を少し変えます。
先ほどと同じく、青が player 、赤が target で、新たに加えた黄色のオブジェクトは obstacle (障害物)です。
ここでは、障害物を認識して、障害物のある通路を避けて迂回して target を追いかける移動AIを作成します。
これには、Nav Mesh Obstacle というものを使います。
[操作]
- 黄色の obstacle (障害物となるオブジェクト)に Nav Mesh Obstacle という Component をアタッチします。
これだけです!わずか3秒!
またもや...
障害物のある通路を避けてくれず、行き詰まってしまいました。
調べてみると、 Nav Mesh Obstacle Component の Carve にチェックを入れると良いらしい。
[操作]
- Nav Mesh Obstacle Component の Carve にチェックを入れる
見事に迂回しました!
最後に
今回は以上です。
AIって、なんだか実装大変そうなイメージの項目。実際ゲームの企画をしている時にも、「敵どうする?」「AI必要じゃない?」「作るのムズそう」「NPC対戦やめて対戦プレイ形式にしよっか」みたいな話が出たりしました。
Unityなら、非常に簡単に、爆速で、移動AI作れます。
ぜひ試してみてください!
参考記事
【Unity】NavMeshを学ぶ 障害物編 - うら干物書き
NavMeshの使い方 その1 - テラシュールブログ
NavMesh Obstacle の作成 - Unity User Manual