AIナビゲーションの例
サンプルワールド

Udonでは AI Navigation を利用できます。このサンプルでは、パスファインディング(経路探索)の仕組みや、ワールド内を歩き回るNPCキャラクターの作成方法を紹介します。
ぜひ 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には destination として「NPC Finish」ブロックが設定されます。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" には4つの "NPC" 子GameObjectがあり、これらは NavMeshAgent と UdonBehaviour を持つカプセルです。
- NavMeshAgent が基本的なナビゲーションと移動ロジックを提供し、UdonBehaviour がこのシーンで必要なロジックを担います。
- "Canvas" には進捗表示とリセットボタンが含まれています。
ネットワーキング
インスタンス内の全ユーザーに対して同期を行うため、どの変数やロジックを同期させ、どれをローカルで実行するかを慎重に選択しています。
Courseには同期される変数が1つあります。それは progress float型変数で、これはCourseのオーナー側でチェックされ、更新されるたびに他の全ユーザーに同期されます。他のユーザーはこの変数の変更を監視し、変更があれば進捗バーを更新します。また、CourseはNetworked Eventを使用して、progress が successThreshold を超えたときに、全員に対して Win イベントを呼び出します。なお、successThreshold は、進捗を計測しているNPCの邪魔をする他のNPCを考慮して 0.8 に設定されています。
各NPCは、そのオーナーのデバイス上で NavMeshAgent によって移動し、VRCObjectSync コンポーネントが他の全ユーザーに対して自動的に位置を更新します。同期されたNPC側ではNavMeshを必要としないため、NavMeshのオーナーのみが実際にNavMeshを継続的に再構築します。
独自の変更を加える
シーンのコピーを作成したら、以下のアイデアを試してシーンをさらに発展させ、AI Navigationパッケージの力を体験してみましょう。
- コースを変更し、スタート地点とゴール地点をさらに離してみる。
- 利用可能なブロックの数を3つから2つに減らす。
- ターゲットポイントが時間経過で移動するようにする。
- ワールド内の各キャラクターに独自のNPCとNavMeshを持たせて、レース形式にする。
最終更新: