読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

マップから落ちないようにステージ上を歩かせる楽な方法

Unity Navmesh

UnityでRPGを開発する上で、最初に当たる問題が「移動」に関する問題だ。キャラクターを動かす事は(Transformを直接変更したり、CharacterControlを使ったりRigidbodyに色々したりして)難しくはないが、「障害物に突っ込まない」とか「崖の下に落ちないようにする」といった挙動を実現する場合は厄介だ。

特に「落ちないようにする」を実現するのは若干面倒で、方法こそ色々とあるがどれも地味に面倒くさかった。

  1. 見えない壁を配置する
  2. 地面に(例えば6本の)Rayを常に飛ばす
  3. そもそも落下地点に移動出来ないようにする(ブロック単位の移動)

が、気づいたら(4.2より)NavmeshがUnity無料版でも使えるようになったので、それをつかって実現してみようと思う。



Navmeshについて

ナビゲーションメッシュ(または Navmesh と呼ばれる)はゲーム世界の物体の簡素化された表現であり、これを使ってゲームプレイの際にエージェントがゲーム世界をナビゲーションします。

正直上手く言えないが、経路を探索するAIを管理するシステムだ。これを使用すると障害物を回避して移動…といった面倒なAI処理を一発で行ってくれる。

例えば下の絵のAがBへ行く場合、最短距離は目の前の壁を貫通することだ。ただ、壁を貫通するのはゲーム的にアレなので、壁を迂回するのが望ましい。Navmeshはそこらへんを簡単に実現してくれる便利機能だ。

スクリーンショット 2013-11-04 22.20.09 スクリーンショット 2013-11-04 22.18.46

で、その便利機能を上手く使うと、「障害物を避ける」やら「崖から落下しない」が簡単に実現出来る。


まずNavmeshを作る。手順を探したら自分のブログがヒットする悲しさよ。
[Unity3D]NavMeshの使い方 その2

おさらいしておくと、こんな感じ。

  1. ステージを作成
  2. ステージのオブジェクトをstaticにする(Navigation StaticでOK)
    スクリーンショット 2013-11-04 22.30.44
  3. Window>Navigation でNavigationを開いて、Bake
  4. マップが青くなる
    スクリーンショット 2013-11-04 22.28.58
 

後はオブジェクトにNavmeshAgentコンポーネントをアタッチし、スクリプトから取得、NavmeshAgent.SetDestinationに移動先を与えれば、自動的に障害物を避けて進んでくれる。


で、今回はこの障害物を避けて進む部分だけを使わせてもらう。SetDestinationの変わりに、キー入力から取得する方向をNavmeshAgent.Moveに突っ込む。

これで、障害物に当たるし崖から落ちないキャラクターが完成。

スクリーンショット 2013-11-04 22.43.25
デモ

ちなみに、この動かし方だとNavmeshで設定したオブジェクト以外は接触出来ない。もしNPCのような「動く障害物」を配置する場合は、NavmeshObstacleを設定しておく必要がある。

ちなみにNavMeshAgent.path.cornersでパス一覧が取れるんで、次のパスの方向にrigidbodyのvelocityで飛ばすのもありかも。

スクリーンショット 2013-11-04 23.04.24