Navigationサンプル
Your Gaming Circleメンバーシップでは、全てのサンプル、SDK、そして最速でマルチプレイヤーゲームを作成するのに必要となるサポートをご利用いただけます。ゲーミング以外の場合は、Industries Circleで完全なスイート、および専用ライセンスオプションをご提供しています。
概要
サンプルには、良く使用されるシンプルなnavmeshとナビゲーションエージェントセットアップが含まれており、きちんとUnityシーンに分かれています。Quantumナビゲーションでご提供できることを理解するのに最適なスタート地点です。Navigation Manualをお手元にご用意することも忘れないでください。
このシーンはナビゲーションのワークフローおよび実装のご紹介を目的に作成されました。
Unity再生ボタン横のシーン選択ドロップダウンUIで、サンプルシーンをブラウズすることができます | |
シーンには、短いテキストの説明UIと、ゲームオブジェクト、アセット、ソースコードファイルへのリンクが表示され、関連するオブジェクトを素早く選択することができます。必ず、Unityのシーンやゲームビューでリンクをクリックしてみてください。 |
ダウンロード
Version | Release Date | Download | ||
---|---|---|---|---|
2.1.0 | 2022年9月15日 | Navigation Sample 2.1.0 Build 22 |
技術情報
- 要件: Unity
2021.3.8f1
以降
詳細
1) レベルウェイポイントへのシンプルな2Dナビゲーション
このサンプルは2D変換コンポーネントを持つエージェントが、ウェイポイントからウェイポイントへランダムに自動で移動し、操縦するための簡単なナビメッシュを示したものです。
エージェントは、ウェイポイントの固定リストを持つアセットへの参照を持っています。また、次に見つけるべきウェイポイントを決定するためのインデックスも持っています。navmeshを使用してウェイポイントに到達すると、このインデックスが次のウェイポイントに増加します。
C#
var path = f.FindAsset<Waypoints>(wayPoints->Path.Id);
var navmesh = f.FindAsset(wayPoints->Navmesh);
wayPoints->CurrentPointIndex += 2;
wayPoints->CurrentPointIndex = wayPoints->CurrentPointIndex % path.Points.Length;
var point = path.Points[wayPoints->CurrentPointIndex];
// Randomize the next waypoint position a bit before set target
if (navmesh.FindRandomPointOnNavmesh(point, FP._2, f.RNG, *f.NavMeshRegionMask, out var result)) {
point = result;
}
pathFinder->SetTarget(f, result, navmesh);
WayPointSystem.cs
とWayPointComponents.qtn
の完全な実装を参照するには、Quantum Codeプロジェクトを開いてください。
WaypointBaker
ゲームオブジェクトのウェイポイントをシーン内で直接変更し、WaypointsAsset
にベイクされるウェイポイントを追加または変更することは可能です。その後、MapData
ゲームオブジェクトのBakeAllをクリックして、レベル、ナビメッシュ、およびウェイポイントアセットをリベイクします。
2) デフォルトの3Dキャラクターコントローラを使用したナビゲーション
このサンプルは、3Dレベルをレイキャストするためにクリックしたときに送信される Quantum Commandを使用してエージェントをステアリングする方法を示しています。ステアリングシステムは、デフォルトのキャラクターコントローラ3Dを使用して、コマンドで送信された位置にエージェントを移動します。
C#
var navmesh = f.Map.NavMeshes["MapNavMeshUnity"];
if (f.Unsafe.TryGetPointer(filter.EntityRef, out NavMeshPathfinder* pathFinder)) {
pathFinder->SetTarget(f, command.ClickPosition, navmesh);
}
KCCMovementSystem.cs
とKCCPlayer.qtn
の完全な実装を参照するには、Quantum Codeプロジェクトを開いてください。KCCController3D
configを編集すれば、エージェントの動きを調整することができます。
注: ムーブツーコントロールにQuantumコマンドを使用することは、例えばMobaのような入力を実装する方法としては推奨されません(コマンドは信頼性の高いものしか実行できず、サーバーへのRTTが必要です。詳しくはQuantum Mobaサンプルを参照してください)。
このサンプルでは、OnlineMenuを使用して起動すると追加のアバターが作成されます。Quantumのエンティティプロトタイプは、MapNameInfo
内のマップのUserDataに設定されています。
3) カスタムステアリングコールバックを使用したナビゲーション
このサンプルでは、パスファインディングと内部ウェイポイント検出ロジックを維持したまま、デフォルトのnavmeshエージェントステアリングロジックをオーバーライドする方法を紹介します。
注: 詳細はUsing Navmesh Agent Callbacksを参照してください。
これは、キャラクターの移動とステアリングが、デフォルトのナビゲーションステアリングパラメータでは設定できないゲーム特有の特性を必要とする場合に推奨される方法です。このサンプルでは、エージェントconfigのMovementTypeはCallbackMovementAgentConfig
内で
Callback
に設定されます。
カスタムステアリングロジックは、CallBackMovementKCC
configに支援されたデフォルトのキャラクターコントローラーを使用してターゲットに向かって移動し、バウンドします。詳細については、CallBackMovementSystem.cs
システムを開いてください。
4) Navmeshリンク
このサンプルでは、navmeshリンクを使って、1つのnavmeshの2つの部分をつなぎ、エージェントがアブソーバーをジャンプできる方法を示しています。リンクがいつ始まるかは、OnNavMeshWaypointReached
コールバックのWaypointFlag
を利用して知ることができます。JumpOffSystem.cs
は、エージェントがリンクに近づいたときに登録し、ジャンプの「アニメーション」をトリガーします。
C#
if (waypointFlags.HasFlag(Navigation.WaypointFlag.LinkStart)) {
if (f.Unsafe.TryGetPointer<NavMeshPathfinder>(entity, out var pathfinder) &&
f.Unsafe.TryGetPointer<CharacterController3D>(entity, out var character)) {
var linkTargetDirection = (pathfinder->GetWaypoint(f, pathfinder->WaypointIndex + 1) - waypoint).Normalized;
character->Velocity = linkTargetDirection * character->Velocity.Magnitude;
character->Jump(f);
}
}
注: 詳細はNavmeshオフメッシュリンクの使用を参照してください。
Quantum navmeshベイキングは、Unityシーンに配置されたUnity OffMeshLinkをQuantum navmeshリンクに変換します(シーン内のOffMesh
ゲームオブジェクトを参照してください)。
5) Navmesh領域の動的な切り替え
このサンプルは、レベル内の橋を有効にするためにnavmesh領域を切り替える方法を示しています。プレイモードで緑のボタンをクリックすると、navmesh領域のオン/オフが動的に切り替わります。
Quantum Commandは、ランタイム中にnavmeshの一部を有効化/無効化するために発行されます(ゲームシーンのButtonFirst
ゲームオブジェクトを参照してください)。コマンドは領域のNameを送信し、シミュレーションはその値をトグルします。
C#
var region = f.Map.RegionMap[Name];
// Enable or disable the navmesh region based on region name
f.NavMeshRegionMask->ToggleRegion(region, !f.NavMeshRegionMask->IsRegionEnabled(region));
f.Events.SetupButtonState(Name, f.NavMeshRegionMask->IsRegionEnabled(region));
// Sends a signal to agents repath
f.Signals.OnRegionChanged();
Navmesh領域はnavmeshにベイクされています。プレイモードでシーンビューを開くと、nvamesh領域が別の色で表示され、無効にするとグレーアウトします。EditorSettings
のDraw Nav Mesh
が有効か確認してください。
NOTE: 詳細はN
avmeshオフメッシュリンクを参照ください。
MapNavMeshRegion.cs
スクリプトはQunatum領域として領域をマークし、領域名を選択するために使用されます(FirstRegion
ゲームオブジェクトを参照ください)。