僕はNavMeshを使ったことがない。
Unityをぼちぼち使ってきているのにも関わらず、NavMeshを使ったことがない。
そんな僕は、きっとみんなからバカにされているに違いない。
勉強しよう……。
この記事にはUnity2017.1.2f1を使用しています。
ドキュメントは読むさ
まず、ドキュメントを読むことが大切だ。
ドキュメントを読めば八割がたNavMeshを理解したといっても過言ではないだろう。
さっそく読んでみる。
読み終わった。
気分はNavMeshマスターだ。
とはいえ、日本語のドキュメントはUnity5.4時代のものだ。
情報が古いかもしれない。
ここは最新の情報として、今年のUniteであったNavMeshのセッションの動画を見ておこう。
これで完璧だ。
メニューが無いんだが
さあ、すでにNavMeshマスターに最も近い男になったわけですが、実際にNavMeshを使ってみなくてはマスターになることは出来ないだろう。
まずは適当にオブジェクトを配置してみた。
よし、これにNavMeshを設定するぞ。
……。
NavMeshを作るウィンドウがない!
どういうことだ、ドキュメントにはそれっぽいウィンドウが表示されているのに、俺のUnityには表示されてない!
こいつは、バグだな!
バグレポートに送るとしよう。
ん、Windowメニューに何かあるな。
……。
無論知っていたさ!
使ったことのないメニューだから、メニューから表示しないと画面に表示されないことぐらい。
俺はUnityを試したのさ!
バグレポートは取り消すとしよう。
焼けないのだが
さて、気を取り直して今度こそNavMeshを設定しよう。
Bakeボタンをポチっとな。
何も反応しないじゃないか!
Bakeボタンの押し方悪かったのかもしれない。
連打してみよう。
……。
くっ、やはり反応しない。
こいつは、バグだな!
バグレポートに送るとしよう。
ん、何々?
オブジェクトの設定がおかしいって?
Navigation Staticが設定されていないと。
……。
いーや、そんなはずはない。
俺はそんな初歩的なミスは侵さないはずだ!
そういえばさっき小腹が空いたから、コンビニに竹輪を買いに行った気がする。
そのすきに何者かがNavigation Staticの設定を外したに違いない!
こいつは事件の匂いがするぜ!
バグレポートは取り消すとしよう。
さて何者かの陰謀により、外されたNavigation Staticの設定を再度行い、再びBakeだ!
NavMeshが設定された。
うむ、計算通りだ!
動かないのだが
では続いて、このNavMeshを実際に使ってみよう。
移動するオブジェクト(Player)と目標地点(Target)を追加するぞ!
よし、これで勝手にPlayerオブジェクトがTargetオブジェクトまで動くはずだ。
再生っと。
動きやがらねえ!
どういうことだ。
NavMeshを設定すれば、何もせずに思った通りに動くようになるのではないのか。
えっ、何々。
NavMeshAgent
なるものが必要だって?
なるほど、ちょっと早とちりをしてしまったようだね。
PlayerオブジェクトにNavMeshAgent
を付けて再度チャレンジしてみよう。
動きやがらねえ!
どういうことだ。
NavMeshAgent
を付けたのにTargetに向かって動き始めない。
こいつは、バグだな!
バグレポートに送るとしよう。
えっ、何々。
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
さあ、実行だ。
見事動いた、さすが俺だ!
いじってみるのだが
目的は達成したが、もう少しパラメータをいじってみよう。
NavMeshを焼く際に、いくつかパラメータがあった。
変更するとどうなるのだろうか。
AgentRadiusの項目を変更してみよう。
なるほど、隙間が小さくなったぞ。
小さい部分でもAgentとやらが通れるようになったからか、壁の上の部分まで通れるようになってしまった。
なるほど、いろいろ調整できるわけだね。
そして、さっきから気になっていたのだが、左上の円のオブジェクトの段差を何事もなかったかのようにPlayerオブジェクトは進んでいった。
俺はこの道を進ませる気が無いというのにだ!
左上にある円のオブジェクトの高さは0.2メートルほどだ。
この段差を進ませないようにしたい。
StepHeight。この項目が怪しそうだ。
0.2より小さくしてしまえ。
見事通れなくなったぞ。
終わったのだが
続きました。