AIナビゲーションの例
Example World

Udonでは AI Navigation を利用できます。この例では、パスファインディングや、ワールド内を歩き回るNPCキャラクターの作成にAI Navigationをどのように活用できるかを紹介します。
AI Navigation Example World にアクセスして、ぜひ実際に体験してみてください!
サンプルの使用方法
このシーンには、赤いブロックから緑のブロックへ移動しようとするNPCが配置されています。青いブロックを動かすことで、NPCの通り道を作ることができます。UnityのAI Navigationは、ブロックを配置し直すたびに、NPCの経路を自動的に再計算します。
Unity Editorでシーンを開いて、基本的な機能をテストしてみましょう。VRChatでの動作とほぼ同じはずです。プレイモードに入ると、NPCは緑のブロックに到達しようとします。青いブロックを動かして、AIが目的地にたどり着けるように誘導してみてください。「Reset」ボタンを押せば、やり直すことができます。
サンプルのインポート
以下の手順に従って、このサンプルをUnityプロジェクトに追加してください:
- Unityエディターのメニューから「VRChat SDK > 🏠 Example Central」を選択して、Example Centralウィンドウを開きます。
- リストの中からこのプレハブを探すか、タイトル(このページのタイトルと同じ)で検索してください。
- 「Import」ボタンを押して、Unitypackageをプロジェクトにインポートします。
技術解説
このシーンを動作させているUdonのロジック、シーン構造、ネットワーキングについて解説します。
ロジック
シーンの初期化時、各NPCは「NPC Finish」ブロックを destination に設定します。NPCはその場所へ到達しようと試みますが、そこへ向かう直接的な経路がないため失敗します。各NPCStepがドロップされると、NavMeshSurface.BuildNavMesh が呼び出され、メインのサーフェスが再構築されます。これによりターゲットへの経路が改善されると、各エージェントは移動を再開します。0.5秒ごとに、最初のNPCとターゲットブロック間の距離を、シーン開始時に保存された初期距離と比較することで進捗状況が再計算されます。確認時にその距離が0.15ユニット未満になるとパーティクルが放出され、進捗チェックは停止します。その後、「Reset」ボタンを押すと最初からやり直すことができます。
シーンの概要
シーンのヒエラルキーは以下の通りです:
- 「World」には、シーン記述子、床、ライティングなどが含まれています。
- "Course"は、NPCが移動できる範囲を定義します。
- NavMeshSurfaceコンポーネントを使用すると、Unityは実行時にナビゲーションロジックを再構築できます。
- CourseManager UdonBehaviourコンポーネントが、プログレスバーの処理とリセットを行います。
- "NPC Start"および"NPC Finish"の子GameObjectが、NPCの開始位置と目標位置を定義します。
- 3つの"NPC Step"子GameObjectは、NPCの足場として機能します。
- 各NPC StepにはNavMeshModifierコンポーネントがあり、その表面をメインのNavMeshSurfaceに追加しようと試みます。
- また、VRCPickupコンポーネントとUdonBehaviourも備えており、持ち運ばれている間は回転を固定して水平を保ち、メインのナビゲーション表面を再構築するロジックを適用します。
- "NPCs"には、それぞれNavMeshAgentとUdonBehaviourを持つCapsuleである、4つの「NPC」GameObjectが含まれています。
- NavMeshAgentが基本的なナビゲーションと移動ロジックを提供し、UdonBehaviourがこのシーンに必要なロジックを担います。
- "Canvas"には、進行状況インジケーターとリセットボタンが含まれています。
ネットワーク
どの変数やロジックを同期し、どれをローカルで実行するかを慎重に選択することで、発生するすべての事象をインスタンス内の全ユーザーに対して同期させる必要があります。
コースには、同期された変数が1つあります。これは progress float で、コースのオーナー側でチェックされ、更新されるたびに他の全ユーザーに同期されます。他のユーザーはこの変数の変更を監視し、変更された際にそれぞれのプログレスバーを更新します。また、コースでは Networked Event を使用して、progress が successThreshold(設定値:0.8)より大きい場合に全員向けの Win イベントを呼び出します。これは、計測対象以外のNPCが進行を妨害する可能性を考慮するためです。
各NPCはオーナーのデバイス上にある NavMeshAgent によって移動し、VRCObjectSync コンポーネントが他の全ユーザーに対して自動的にその位置を更新します。同期されたNPCにはNavMeshが不要なため、実際にNavMeshを継続的に再構築するのはNavMeshのオーナーのみです。
独自の変更を加える
シーンのコピーを作成したら、以下のアイデアをいくつか試してシーンをさらに発展させ、AI Navigationパッケージの可能性を探ってみましょう。
- コースを変更し、開始地点と終了地点をさらに離してみる。
- 利用可能なブロックの数を3個から2個に減らす。
- ターゲット地点が時間経過とともに移動するようにする。
- ワールドにいる全員に個別のNPCとNavMeshを割り当てて、レースにしてみましょう!
最終更新: