徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

【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