Redhuのゲーム開発Fragments

UnityやUEでゲームを作る際に学んだことを、これからなにか作りたい人に向けて。あるいは復習する自分に向けて記す。

UnityのNavMeshを使用した敵移動

Entyの支援者リワードで、「敵MAの構成権」をつけたので、敵MAを動作させるAIを作る必要が出てきました。出てきましたというか、もともとやるつもりだけど背水の陣を敷いたので取り組む理由が生まれたというか。

 

最低限、敵のAIに必要な要素として、「敵は移動しなければならない」があります。いや当然ですよね。

ではどのように移動させるのか、今回はUnityのNavMeshを使ってみました。

 

f:id:redhu:20160514012212p:plain

 

NavMeshとは、上図のように設定されたAIが移動できるエリアのことです。

NavMeshで移動可能エリアに設定するオブジェクトはNavigationStaticである必要があります。インスペクターの右上あたりからチェックを入れておきましょう。

WindowからNavigationタブを表示し、NavMeshを焼くオブジェクトを選択してBakeすれば設定完了。

焼き終わりまでちょっと時間かかります。多分オブジェクトが大きさや複雑さが増すほど時間も。

 

さてこれで、AIが移動できるエリアが決定されました。

 

次にこのNavMeshを使って実際に動く機能をつけます。

動かしたいオブジェクトに、コンポーネント追加からNavMeshAgentを追加しましょう。

 

f:id:redhu:20160514012843p:plain

 

Agent Sizeは要するに当たり判定というか移動可能判定用のサイズ。

Steeringの項目が、速度、旋回性能、加速性能、目標地点までどれくらい近づいたら停止するか。到着時に勢いで行き過ぎないようにブレーキかけてストップさせるか。

あとは障害物の回避判定力とか。

 

あとはスクリプトからこのNavMeshAgentコンポーネント

.destination

に目標地点のPositionを入れれば経路検索して移動してくれます。

 

自分の意志を離れて何かが動き出すのってすごい気持ちいい。

 

ただし目標地点がNavMeshから離れすぎてしまうと経路を見失ってしまう模様。最後に見失った地点まで進んで立ち止まります。

NavMeshAgentのついたオブジェクトはNavMesh上に居なければエラーを吐くので、nullチェックでセーフティーかけとかなければいけません。

それにあくまで設定したオブジェクトが目標地点まで移動してくれるだけなので、機体のアニメーションと連動させるとかにはいろいろと小細工をしました。

ひとまずまあ、こういうかたちでAIを作って行きます。

うに部屋さんに置かせて頂いているリメイク対象の旧作

unityroom.com