Unity_NavMesh

Unity

NavMeshSurfaceコンポーネントは、基本的にエージェントが歩行できる領域を定義するために使います。そのため、地面に設定するのが一般的です。

1. 椅子や机を「障害物」として設定する

ほとんどの場合、椅子や机はキャラクターが避けて通るべき障害物として扱います。この場合、NavMeshSurfaceコンポーネントは床のみに設定します。

そして、椅子や机などのオブジェクトには、Inspectorで**Navigation Static**にチェックを入れます。こうすることで、NavMeshをベイクする際に、それらのオブジェクトが「障害物」として認識され、キャラクターは椅子や机を避けるように経路を生成します。


2. 椅子や机を「歩行可能な領域」として設定する

椅子や机の上をキャラクターが歩けるようにしたい場合は、そのオブジェクトにもNavMeshSurfaceを設定できます。

たとえば、広い机の上をキャラクターが歩き回るシミュレーションをしたい場合は、机のメッシュにもNavMeshSurfaceコンポーネントをアタッチし、Bakeします。

複数のNavMeshSurfaceコンポーネントを同じシーンに配置する場合、それぞれのNavMeshSurfaceBakeボタンを押す必要があります。


どちらを選択すべきか?

  • 床のみに設定する(椅子・机は障害物):
    • 利点: キャラクターが現実的な行動をします。椅子や机を避けたり、周りを回ったりします。
    • 欠点: 椅子の上にキャラクターを座らせる、机の上の物を取るなどの高度なインタラクションには、スクリプトによる個別の制御が必要です。
  • 椅子・机にも設定する(歩行可能):
    • 利点: キャラクターが椅子や机の上を自由に移動できるようになります。
    • 欠点: 現実離れした動きになる可能性が高いです。キャラクターが椅子や机の上を歩くことを意図しない限り、この方法は避けるべきです。

 結論として、椅子や机は床とは別に「障害物」として設定するのが、最も現実的で一般的なアプローチです。

椅子や机を障害物として設定する際

 椅子や机を障害物として設定する際は、NavMeshの**「ベイク」**機能を利用します。これにより、キャラクターはそれらを自動的に避けて移動するようになります。


1. ナビメッシュ障害物として設定する

以下の手順で、椅子や机がナビメッシュの経路に影響を与えるように設定します。

  1. まず、ナビメッシュを生成する床となるオブジェクトにNavMeshSurfaceコンポーネントがアタッチされていることを確認してください。
  2. シーン内に配置した椅子などの障害物オブジェクトを選択します。
  3. InspectorウィンドウでStaticの隣にあるドロップダウンをクリックし、**Navigation Static**にチェックを入れます。
  4. これにより、Unityはこれらのオブジェクトをナビメッシュを生成する際の障害物として認識します。

2. NavMeshのベイクを実行する

次に、設定を反映させるためにNavMeshを再生成します。

  1. 床のオブジェクトを選択し、InspectorウィンドウのNavMeshSurfaceコンポーネントにある**Bake**ボタンをクリックします。
  2. ナビメッシュが再生成されると、椅子や机の周りが青いナビメッシュから除外されていることが確認できます。
  3. これで、キャラクターは椅子や机を避けて経路を計画し、移動するようになります。

このように、キャラクターが避けるべき静的なオブジェクトは、Navigation Staticに設定するだけで簡単に障害物として機能させることができます。

Navigation Staticがdeprecatedの場合

その表示は「このStatic設定は非推奨です」という意味です。Unityのバージョンアップによって、従来のStaticチェックボックスでまとめていた機能が、それぞれ専用のコンポーネントに分離されました。

これは、以前の方法では静的なオブジェクトにしか対応できませんでしたが、新しい方法では動的な障害物にも対応できるようにするためです。

椅子や机をナビメッシュの障害物として設定する、最新かつ推奨される方法は、**NavMeshObstacle**コンポーネントを使用することです。


NavMeshObstacleコンポーネントの設定

  1. オブジェクトの選択: 椅子や机など、障害物として設定したいオブジェクトをHierarchyウィンドウで選択します。
  2. コンポーネントの追加: Inspectorウィンドウの**Add Componentボタンをクリックし、検索ボックスにNavMeshObstacle**と入力して追加します。
  3. 形状とサイズの調整: 追加されたNavMeshObstacleコンポーネントの**Shapeで障害物の形状(BoxCapsuleなど)を設定し、Size**でサイズを調整して、オブジェクト全体を覆うようにします。
  4. 障害物として有効化: **Carve**というチェックボックスにチェックを入れます。これが最も重要です。Carveを有効にすることで、NavMeshAgentは障害物をリアルタイムで避けるようになります。
  5. NavMeshの再ベイク: NavMeshObstacleは動的な障害物にも対応するため、このコンポーネントを追加した後にNavMeshを再ベイクする必要はありません。椅子や机が静的な障害物として機能してほしい場合は、床のNavMeshSurfaceで一度だけBakeしておけば、あとはキャラクターが自動的に避けてくれます。

机をNavMeshの障害物として設定するには、**NavMeshObstacle**コンポーネントを使います。

例:机をNavMeshの障害物として設定するには、**NavMeshObstacle**コンポーネントを使います。


机を障害物にする手順

  1. 机のオブジェクトを選択 Hierarchyウィンドウで、障害物にしたい机のオブジェクトを選択します。
  2. NavMeshObstacleコンポーネントを追加 Inspectorウィンドウの**Add Component**ボタンをクリックし、「NavMeshObstacle」と入力して追加します。
  3. Carveにチェックを入れる 追加されたNavMeshObstacleコンポーネントで、**Carve**というチェックボックスにチェックを入れます。これが、キャラクターが机を避けるようにナビメッシュのための重要な設定です。

この方法では、NavMeshSurfaceでベイクされたナビメッシュを再生成する必要はありません。Carveにチェックを入れるだけで、キャラクターは自動的に机を避けて移動するようになります。

机、椅子な椅子などの障害物をまとめてグループ化した場合、まとめて設定できるのか

はい、机や椅子などの障害物をまとめてグループ化した場合、まとめて設定できます。親オブジェクトに設定することで、その下のすべての子オブジェクトに同じ設定を適用できます。


グループ化した障害物の設定方法

  1. 親オブジェクトの作成 Hierarchyウィンドウで右クリックし、**Create Empty**を選択して空のゲームオブジェクトを作成します。これを親オブジェクトとします(例:「Furniture」など)。
  2. 子オブジェクトにまとめる シーンにあるすべての机や椅子のオブジェクトを、作成した「Furniture」オブジェクトの下にドラッグ&ドロップします。これで、机や椅子がグループ化されます。
  3. まとめてNavMeshObstacleを追加 親オブジェクト(「Furniture」)を選択し、Inspectorウィンドウの**Add ComponentからNavMeshObstacle**を追加します。

この方法でNavMeshObstacleを追加すると、Unityは親オブジェクトを単一の障害物として扱います。しかし、多くの場合、個々の机や椅子をそれぞれ独立した障害物として認識させたいはずです。

個別の障害物として認識させる方法

より現実的なシミュレーションのためには、以下の方法が推奨されます。

  1. 親オブジェクトにNavMeshObstacleを設定しない グループの親オブジェクトにはNavMeshObstacleコンポーネントを追加しません。
  2. 個々の子オブジェクトに設定する グループ内の個々の机や椅子のオブジェクトを一つずつ選択し、それぞれに**NavMeshObstacle**コンポーネントを追加します。
  3. Carveにチェックを入れる 各オブジェクトにアタッチしたNavMeshObstacleコンポーネントの**Carve**チェックボックスにチェックを入れます。

この方法であれば、キャラクターは机と椅子の間をすり抜けたり、それぞれの障害物を個別に避けて移動したりする、より現実的な行動をとるようになります。親オブジェクトを使うのは、整理のためだけに使い、AIの挙動は個別のオブジェクトで設定するのがベストです。

形状がBOXとカプセルしか選択できないシリンダーには適用できないのか

形状がBOXとカプセルしか選択できないシリンダーには適用できないのか

Cylinder(シリンダー)の形状を直接選択することはできませんが、BoxとCapsuleを組み合わせて、シリンダーのような障害物として設定することは可能です。NavMeshObstacleコンポーネントでは、複雑な形状の障害物はBoxとCapsuleのプリミティブ(基本的な図形)の組み合わせで表現するのが一般的です。


シリンダー形状の障害物の作り方

  1. NavMeshObstacleの設定: シリンダーのオブジェクトにNavMeshObstacleコンポーネントをアタッチします。
  2. 形状の選択:
    • ShapeCapsuleに設定します。
    • Radius(半径)と**Height**(高さ)の値を調整して、シリンダーの形状に合わせます。

もし、より複雑な形状の障害物を作成したい場合は、複数のNavMeshObstacleコンポーネントを子オブジェクトとして配置し、それぞれにBoxやCapsuleを設定して組み合わせることもできます。


中心座標やサイズは、手動で入力するのではなく、NavMeshObstacleコンポーネントに設定されているギズモを直接ドラッグして調整するのが一般的で効率的です。自動でぴったり合わせる機能は通常ありませんが、この方法で視覚的に直感的に設定できます。


ギズモを使った調整方法

  1. NavMeshObstacleコンポーネントをアタッチ: オブジェクト(例:シリンダー)を選択し、NavMeshObstacleコンポーネントを追加します。
  2. ギズモの表示: シーンビューで、NavMeshObstacleコンポーネントの**Size**のギズモが表示されます。
  3. ギズモをドラッグして調整: シーンビューでこのギズモを直接ドラッグすることで、**CenterSize**の値をマウスで直感的に変更できます。

この方法であれば、数値を手動で入力する手間が省け、オブジェクトの形状に視覚的に合わせることができます。

自動で大体あった位置になっている。

はい、その通りです。NavMeshObstacleコンポーネントには、オブジェクトの形状に合わせて自動的にサイズを調整する機能があります。

これは、コンポーネント内の**RecalculateまたはFitというボタンをクリックすることで実行できます。これにより、障害物のCenterSize**がオブジェクトの境界ボックス(Bounding Box)に合わせて自動で設定されます。


自動調整の方法

  1. オブジェクトを選択: 障害物として設定したいオブジェクト(例:机や椅子)を選択します。
  2. NavMeshObstacleコンポーネントを追加: まだ追加していない場合は、Add ComponentからNavMeshObstacleを追加します。
  3. 自動調整を実行: NavMeshObstacleコンポーネント内の**FitまたはRecalculate**ボタンをクリックします。

この機能を使うと、大まかな設定は自動で行われ、手動で数値を入力する手間が省けます。より精密な調整が必要な場合は、Sizeの数値を微調整したり、シーンビューのギズモを直接ドラッグして調整したりするのがおすすめです。

コメント