静的(動かない)なGameObjectであれば、NavMeshをBakeすればよいが、動的(動く)GameObject(障害物)だと、ずれた場所にはリアルタイムでNavMeshを反映してくれない。
動的(動く)GameObject(障害物)にリアルタイムでNavMeshを反映させるには”Nav Mesh Obstacle”コンポーネントをその障害物に付ければよい。
※以下の説明で、NavMeshの範囲を見る場合は、Play状態にして、Sceneウィンドウを開きつつ、Navigationタブを開くと、NavMeshの範囲(青い枠)がリアルタイムでわかるので良いです。(以下のような画像の状態)
そして、障害物を手動で動かす(赤とか青とかの矢印を直接動かして)とNavMeshの穴もちゃんと動く様子が見えます。
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-74-1024x626.png)
“Nav Mesh Obstacle”コンポーネントを付けた障害物の動き
1.以下のように障害物(今回は以下の赤いCylinder)に”Nav Mesh Obstacle”コンポーネントを付ける
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-67-1024x474.png)
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-68.png)
2.SceneタブでNav Meshを見ると以下のような感じ。この状態でも、NavMesh Agentはこの障害物を避けるように動こうとはしますが、接触するぐらい近くなってから避けようとするのでうまく迂回できないことが多い。
※床としている白いCubeは”Navigation Static”にして、NavMeshをBakeしてある。
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-69-1024x560.png)
3.”Carve”を有効にする。
障害物の周りをある程度余裕をもって迂回するようにする場合は、”Carve”を有効にします。
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-70.png)
4.すると、以下のように障害物の周りに穴(NavMesh Agentが移動できない範囲)ができて、余裕をもって、NavMesh Agentは障害物をよけてくれます。
しかし、デフォルトではこの穴は、障害物が止まっているときにのみ作成されて、動いている最中は、”Carve”を無効にしているときと同じ動きになります。
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-71-1024x555.png)
5.障害物が動いている間もリアルタイムに穴をあけたい場合は、”Carve Only Station”を無効にします。
そうすると、障害物が動いている間もリアルタイムで穴が作られ、NavMesh Agentがその穴を避けて動いてくれます。
![](https://programming.sincoston.com/wp-content/uploads/2021/08/image-72.png)
6.以上、”Nav Mesh Obstacle”コンポーネントの使い方でした!
コメント