うら干物書き

ゲームを作っています。

【Unity】NavMeshを学ぶ 焼けた編

 僕はNavMeshを使ったことがない。
 Unityをぼちぼち使ってきているのにも関わらず、NavMeshを使ったことがない。
 そんな僕は、きっとみんなからバカにされているに違いない。
 勉強しよう……。


この記事にはUnity2017.1.2f1を使用しています。

ドキュメントは読むさ

 まず、ドキュメントを読むことが大切だ。
 ドキュメントを読めば八割がたNavMeshを理解したといっても過言ではないだろう。
 さっそく読んでみる。

docs.unity3d.com

 読み終わった。
 気分はNavMeshマスターだ。

 とはいえ、日本語のドキュメントはUnity5.4時代のものだ。
 情報が古いかもしれない。
 ここは最新の情報として、今年のUniteであったNavMeshのセッションの動画を見ておこう。

www.youtube.com

 これで完璧だ。

メニューが無いんだが

 さあ、すでにNavMeshマスターに最も近い男になったわけですが、実際にNavMeshを使ってみなくてはマスターになることは出来ないだろう。

 まずは適当にオブジェクトを配置してみた。

f:id:urahimono:20171012001331p:plain

 よし、これにNavMeshを設定するぞ。

f:id:urahimono:20171012001345p:plain

 ……。
 NavMeshを作るウィンドウがない!

 どういうことだ、ドキュメントにはそれっぽいウィンドウが表示されているのに、俺のUnityには表示されてない!
 こいつは、バグだな!
 バグレポートに送るとしよう。

f:id:urahimono:20171012001418p:plain

 ん、Windowメニューに何かあるな。

f:id:urahimono:20171012001500p:plain
f:id:urahimono:20171012001514p:plain

 ……。
 無論知っていたさ!
 使ったことのないメニューだから、メニューから表示しないと画面に表示されないことぐらい。
 俺はUnityを試したのさ!

 バグレポートは取り消すとしよう。

焼けないのだが

 さて、気を取り直して今度こそNavMeshを設定しよう。
 Bakeボタンをポチっとな。

f:id:urahimono:20171012001540p:plain
f:id:urahimono:20171012001553p:plain

 何も反応しないじゃないか!

 Bakeボタンの押し方悪かったのかもしれない。
 連打してみよう。

 ……。
 くっ、やはり反応しない。
 こいつは、バグだな!
 バグレポートに送るとしよう。

f:id:urahimono:20171012001626p:plain

 ん、何々?
 オブジェクトの設定がおかしいって?

f:id:urahimono:20171012001647p:plain

 Navigation Staticが設定されていないと。

 ……。
 いーや、そんなはずはない。
 俺はそんな初歩的なミスは侵さないはずだ!

 そういえばさっき小腹が空いたから、コンビニに竹輪を買いに行った気がする。
 そのすきに何者かがNavigation Staticの設定を外したに違いない!
 こいつは事件の匂いがするぜ!

 バグレポートは取り消すとしよう。

f:id:urahimono:20171012001710p:plain

 さて何者かの陰謀により、外されたNavigation Staticの設定を再度行い、再びBakeだ!

f:id:urahimono:20171012001731p:plain

 NavMeshが設定された。
 うむ、計算通りだ!

動かないのだが

 では続いて、このNavMeshを実際に使ってみよう。
 移動するオブジェクト(Player)と目標地点(Target)を追加するぞ!

f:id:urahimono:20171012001744p:plain

 よし、これで勝手にPlayerオブジェクトがTargetオブジェクトまで動くはずだ
 再生っと。

f:id:urahimono:20171012001804p:plain

 動きやがらねえ!
 どういうことだ。
 NavMeshを設定すれば、何もせずに思った通りに動くようになるのではないのか。

 えっ、何々。
 NavMeshAgentなるものが必要だって?

 なるほど、ちょっと早とちりをしてしまったようだね。
 PlayerオブジェクトにNavMeshAgentを付けて再度チャレンジしてみよう。

f:id:urahimono:20171012001819p:plain
f:id:urahimono:20171012001804p:plain

 動きやがらねえ!
 どういうことだ。
 NavMeshAgentを付けたのにTargetに向かって動き始めない。

 こいつは、バグだな!
 バグレポートに送るとしよう。

f:id:urahimono:20171012001853p:plain

 えっ、何々。
 NavMeshAgentにどこに向かって移動するかを指定してあげねばならないって?
 そもそもこの状態では、Targetオブジェクトが目的地だって分かりようがないじゃないかだって?

 ……。
 ふむ、一理ある考えだ
 俺の考えは間違ってはいないが、人の意見に耳を貸すのは大事だ。
 その案に乗るとしよう。

 では、NavMeshAgentに目標地点を設定するスクリプトを3秒で完成させよう。

ObjectController.cs

using UnityEngine;
using UnityEngine.AI;

[RequireComponent( typeof( NavMeshAgent ) )]
public class ObjectController : MonoBehaviour
{
    [SerializeField]
    private Transform       m_target    = null;

    private NavMeshAgent    m_navAgent  = null;

    private void Awake()
    {
        m_navAgent  = GetComponent<NavMeshAgent>();
    }

    private void Start()
    {
        if( m_target != null )
        {
            m_navAgent.destination  = m_target.position;
        }
    }

} // class ObjectController

f:id:urahimono:20171012001908p:plain

 さあ、実行だ。

f:id:urahimono:20171012001946g:plain
f:id:urahimono:20171012002011p:plain

 見事動いた、さすが俺だ!

いじってみるのだが

 目的は達成したが、もう少しパラメータをいじってみよう。
 NavMeshを焼く際に、いくつかパラメータがあった。
 変更するとどうなるのだろうか。

 AgentRadiusの項目を変更してみよう。

f:id:urahimono:20171012002025p:plain
f:id:urahimono:20171012002034p:plain

 なるほど、隙間が小さくなったぞ。
 小さい部分でもAgentとやらが通れるようになったからか、壁の上の部分まで通れるようになってしまった。
 なるほど、いろいろ調整できるわけだね。

 そして、さっきから気になっていたのだが、左上の円のオブジェクトの段差を何事もなかったかのようにPlayerオブジェクトは進んでいった。
 俺はこの道を進ませる気が無いというのにだ!

 左上にある円のオブジェクトの高さは0.2メートルほどだ。
f:id:urahimono:20171012002104p:plain

 この段差を進ませないようにしたい。
 StepHeight。この項目が怪しそうだ。
 0.2より小さくしてしまえ。

f:id:urahimono:20171012002117p:plain
f:id:urahimono:20171012001430g:plain

 見事通れなくなったぞ。

終わったのだが

 続きました。

www.urablog.xyz