This document is about: QUANTUM 2
SWITCH TO

Navigationサンプル

Level 4
Quantum Navigationサンプルは、現在、アクティブなPhoton Gaming Circle または Photon Industries Circleサブスクリプションをお持ちのユーザーのみ利用可能となっています。

Your Gaming Circleメンバーシップでは、全てのサンプル、SDK、そして最速でマルチプレイヤーゲームを作成するのに必要となるサポートをご利用いただけます。ゲーミング以外の場合は、Industries Circleで完全なスイート、および専用ライセンスオプションをご提供しています。

概要

サンプルには、良く使用されるシンプルなnavmeshとナビゲーションエージェントセットアップが含まれており、きちんとUnityシーンに分かれています。Quantumナビゲーションでご提供できることを理解するのに最適なスタート地点です。Navigation Manualをお手元にご用意することも忘れないでください。

このシーンはナビゲーションのワークフローおよび実装のご紹介を目的に作成されました。

Unity再生ボタン横のシーン選択ドロップダウンUIで、サンプルシーンをブラウズすることができます
scene selection drop down
シーンには、短いテキストの説明UIと、ゲームオブジェクト、アセット、ソースコードファイルへのリンクが表示され、関連するオブジェクトを素早く選択することができます。必ず、Unityのシーンやゲームビューでリンクをクリックしてみてください。
2d sample screenshot

ダウンロード

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.csWayPointComponents.qtnの完全な実装を参照するには、Quantum Codeプロジェクトを開いてください。

WaypointBakerゲームオブジェクトのウェイポイントをシーン内で直接変更し、WaypointsAssetにベイクされるウェイポイントを追加または変更することは可能です。その後、MapDataゲームオブジェクトのBakeAllをクリックして、レベル、ナビメッシュ、およびウェイポイントアセットをリベイクします。

2d sample screenshot
インゲームヘルプと説明を使用して、Unityオブジェクトとサンプルソースコードファイル内をすばやく移動します。

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.csKCCPlayer.qtnの完全な実装を参照するには、Quantum Codeプロジェクトを開いてください。KCCController3Dconfigを編集すれば、エージェントの動きを調整することができます。

navigation scene gizmos
ナビゲーションシーンのギズモをトグルします。

: ムーブツーコントロールにQuantumコマンドを使用することは、例えばMobaのような入力を実装する方法としては推奨されません(コマンドは信頼性の高いものしか実行できず、サーバーへのRTTが必要です。詳しくはQuantum Mobaサンプルを参照してください)。

このサンプルでは、OnlineMenuを使用して起動すると追加のアバターが作成されます。Quantumのエンティティプロトタイプは、MapNameInfo内のマップのUserDataに設定されています。

3) カスタムステアリングコールバックを使用したナビゲーション

このサンプルでは、パスファインディングと内部ウェイポイント検出ロジックを維持したまま、デフォルトのnavmeshエージェントステアリングロジックをオーバーライドする方法を紹介します。

: 詳細はUsing Navmesh Agent Callbacksを参照してください。

これは、キャラクターの移動とステアリングが、デフォルトのナビゲーションステアリングパラメータでは設定できないゲーム特有の特性を必要とする場合に推奨される方法です。このサンプルでは、エージェントconfigのMovementTypeはCallbackMovementAgentConfig内で Callbackに設定されます。

navigation scene gizmos
To

カスタムステアリングロジックは、CallBackMovementKCCconfigに支援されたデフォルトのキャラクターコントローラーを使用してターゲットに向かって移動し、バウンドします。詳細については、CallBackMovementSystem.csシステムを開いてください。

このサンプルでは、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ゲームオブジェクトを参照してください)。

jump animation
ジャンプ「アニメーション」で、オフメッシュリンクを使用してnavmeshの異なる部分を交互に表示します

このサンプルは、レベル内の橋を有効にするためにnavmesh領域を切り替える方法を示しています。プレイモードで緑のボタンをクリックすると、navmesh領域のオン/オフが動的に切り替わります。

region toggle gif
navmesh(Quantum 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領域が別の色で表示され、無効にするとグレーアウトします。EditorSettingsDraw Nav Meshが有効か確認してください。

NOTE: 詳細はN avmeshオフメッシュリンクを参照ください。

MapNavMeshRegion.csスクリプトはQunatum領域として領域をマークし、領域名を選択するために使用されます(FirstRegionゲームオブジェクトを参照ください)。

Back to top