Help us understand the problem. What is going on with this article?

[Unity] たった3分で移動AI?UnityのNavigation機能がスゴイ

先日 Unity の Navigation 機能について説明を求められる機会がありました。私自身、基本的に Navigation を利用するようなゲームを作らないので、 Navigation に関してはあまり触れたことがなく...。軽く触ってみたら、爆速で簡単な移動AIができて圧巻!ということで記事にしてみました。

[この記事の対象者]
・Unity初級〜中級者
[この記事の目的]
・爆速で簡単な移動AIを作ろう

それでは始めていきましょう!

ステージの作成

まずステージがないと始まらないのでステージを簡単に作っておきます。
今回はこんな感じ。
青が player 、赤が target となるオブジェクトです。
スクリーンショット 2018-11-30 10.35.50.png

自動追従するAIの作成

青の player が赤の target まで、道に沿って移動するAI機能を作成します。

[操作]
1. player(自動で動かしたいもの)に Nav Mesh Agent という Component をアタッチします。
2. 次に、 Navigation ウィンドウで地形を Bake します。
3. スクリプトを書きます。
4. player オブジェクトにスクリプトをアタッチして、 Inspector から player, target にそれぞれ対応するオブジェクトを入れます。

PlayerMove.cs
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の作成終了です!簡単!

できた!と思いきや...

あれ、動かない...なんかエラーが出ている...
スクリーンショット 2018-11-30 10.50.50.png

Bake し忘れたかなー、と思ってもう一度 Bake して再生しても変わらず...

調べてみたら、どうやら通路や壁として使うオブジェクトは Static にチェック入れないとだめなんですね。Terrain はデフォルトで Static になってるので気づきませんでした。
スクリーンショット 2018-11-30 11.41.13_1.png

[操作]
1. ステージに使用しているオブジェクト(床 Plane , 壁 Cube )全てを Static に設定
2. 再度 Bake する

スクリーンショット 2018-11-30 10.55.29.png
水色のエリアがちゃんと通路に沿って作られました!

再生すると、ちゃんと通路に沿って player が target を追いかけています。
ezgif.com-video-to-gif.gif

こんなに簡単に作れちゃうんですね!

障害物を避けて移動するAIの作成

さて続いて、次のステップに進みましょう。

ステージの形を少し変えます。
先ほどと同じく、青が player 、赤が target で、新たに加えた黄色のオブジェクトは obstacle (障害物)です。
スクリーンショット 2018-11-30 11.00.15.png

ここでは、障害物を認識して、障害物のある通路を避けて迂回して target を追いかける移動AIを作成します。
これには、Nav Mesh Obstacle というものを使います。

[操作]
1. 黄色の obstacle (障害物となるオブジェクト)に Nav Mesh Obstacle という Component をアタッチします。

これだけです!わずか3秒!

またもや...

ezgif.com-video-to-gif (1).gif
うーん?なんか違うな...

障害物のある通路を避けてくれず、行き詰まってしまいました。
調べてみると、 Nav Mesh Obstacle Component の Carve にチェックを入れると良いらしい。

[操作]
1. Nav Mesh Obstacle Component の Carve にチェックを入れる
スクリーンショット 2018-11-30 11.50.20_1.png

スクリーンショット 2018-11-30 11.09.22_1.png
おや、水色の範囲が障害物周りだけなくなりました!

気を取り直して、この状態でもう一度再生。
ezgif.com-video-to-gif (2).gif

見事に迂回しました!

最後に

今回は以上です。
AIって、なんだか実装大変そうなイメージの項目。実際ゲームの企画をしている時にも、「敵どうする?」「AI必要じゃない?」「作るのムズそう」「NPC対戦やめて対戦プレイ形式にしよっか」みたいな話が出たりしました。

Unityなら、非常に簡単に、爆速で、移動AI作れます。
ぜひ試してみてください!

参考記事

【Unity】NavMeshを学ぶ 障害物編 - うら干物書き
NavMeshの使い方 その1 - テラシュールブログ
NavMesh Obstacle の作成 - Unity User Manual

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away