オフメッシュリンクの使用
UnityのNav Mesh Linksスクリプトは、Quantumナビメッシュ(Quantum.NavMesh.Links)にベイクされます。
ベイク時に使用されるフィールドは次の通りです。
Bidirectional- 両方向に2つのリンクを作成するCostModifier-Quantum.NavMeshLink.CostOverrideの入力として使用されるArea Type- リンクのリージョンを設定する(「実行時にナビメッシュリンクを切り替える」セクションを参照)Activated- 非アクティブの場合、ベイク時にリンクはスキップされるGameObject.name-Quantum.NavMeshLink.Nameの入力として使用される
ナビメッシュリンクの作成
- Unityの
NavMesh Linkを作成し調整します。
- Quantumナビメッシュをベイクし、リンクが青い矢印のギズモで表示されていることを確認します。(Quantum Gizmosオーバーレイメニューから
NavMeshLinksを有効にして、QuantumMapDataゲームオブジェクトを選択)
- これでエージェントが経路探索でリンクを考慮するようになります。
実行時にナビメッシュリンクを切り替える
Quantumナビメッシュリージョンを使用して、リンクのオン/オフを切り替えることができます。リンクはリージョンIDでベイクされ、グローバルまたはエージェント毎に切り替えられます。詳細な情報はリージョンをご覧ください。
Simpleリージョンモード
UnityのNavMesh LinkのArea Typeを選択して、リージョンを設定します。
Advancedリージョンモード
- Unityの
NavMesh LinkのArea Typeを選択して、リージョン検知エリアに設定します。 - Unityの
NavMesh LinkにMapNavMeshRegionスクリプトをアタッチし、リージョンIdを設定、Cast RegionをNo Regionに設定します。
カスタマイズとシグナル
リンクのデータ構造は、NavMesh.Linksを使用してナビメッシュアセットからクエリできます。リンクindexからname、またはその逆のマッピングが必要な場合に、ディクショナリーを構成できます。
NavMeshPathfinderコンポーネントは、次のリンクAPIを提供します。
bool IsOnLink(FrameBase)- エージェントがリンク上にいる場合はtrueを返すint CurrentLink(FrameBase)-NavMesh.Linksを指す現在のリンクインデックスを返し、リンク上にいない場合は-1を返す
ウェイポイントには、リンク関連のWaypointFlagsが存在します。
LinkStart- このウェイポイントがリンクの始点LinkStop- このウェイポイントがリンクの終点RepathWhenReached- このウェイポイント到達後、エージェントは経路探索を再実行する
エージェントがリンク上にいる間に新しいターゲットが設定された場合、エージェントは現在のリンクを完了してから、経路探索を実行します。(WaypointFlag.RepathWhenReachedを参照)
エージェントがリンクを移動している間は、自動的な経路探索(例:NavMeshAgentConfig.MaxRepathTimeout)は再実行されません。
デフォルトでは、エージェントは通常速度でリンクを移動します。
リンク到達時のエージェント移動を制御するには、ISignalOnNavMeshWaypointReachedシグナルが使用できます。その後、アニメーションが完了するまでエージェントを無効化するか、後述のISignalOnNavMeshMoveAgentコールバックで移動を上書きできます。
- ナビゲーションコールバックを受け取るには、
SimulationConfig.Navigation.EnabledNavigationCallbacksを有効にする必要があります。 ISignalOnNavMeshMoveAgentコールバックを受け取るには、NavMeshAgentConfig.MovementTypeをCallbackに設定する必要があります。エージェントのコンフィグは実行時に変更可能です。
以は、エージェントがリンク開始のウェイポイントに到達した際にテレポートを実行するサンプルコードです。
C#
namespace Quantum
{
using Photon.Deterministic;
using UnityEngine.Scripting;
[Preserve]
public unsafe class NewQuantumSystem : SystemMainThread, ISignalOnNavMeshWaypointReached
{
public override void Update(Frame frame)
{
}
public void OnNavMeshWaypointReached(Frame frame, EntityRef entity, FPVector3 waypoint, Navigation.WaypointFlag waypointFlags, ref bool resetAgent)
{
var agent = frame.Get<NavMeshPathfinder>(entity);
var waypointIndex = agent.WaypointIndex;
if ((waypointFlags & Navigation.WaypointFlag.LinkStart) == Navigation.WaypointFlag.LinkStart)
{
// LinkStart後には必ず別のウェイポイントがある
var linkDestination = agent.GetWaypoint(frame, waypointIndex + 1);
f.Unsafe.GetPointer<Transform2D>(entity)->Position = linkDestination.XZ;
}
}
}
}
Back to top