Navmesh Off Mesh Linksを使用する
QuantumはUnity Off Mesh linkをデータ構造内にエキスポートし、navmeshリンクと稼働するのに必要な最小限のサポートを行います。
Navmesh Linkを作成する
Off Mesh Link
を作成します。QuantumはActivated
プロパティ、Auto Update Positions
プロパティ、Navigation Area
プロパティを無視します。
- マップをベイクして、
MapNavMeshDebugDrawer
スクリプトを使用し結果のリンクを確認します。リンクは青い矢印としてレンダリングされます。
- エージェントはパスファインディングの間にnavmeshリンクを自動的に使用するようになりました。
Navmeshリンクをトグルする
リンクはトグルオン・オフでき、Quantum navmeshリージョンを使用してエージェントが使用できるものを制限します。Off Mesh LinkにMapNavMeshRegion
スクリプトをアタッチして、 Id
およびCast Region
をNo Region
に設定します。
Hooking-In Gameplay
調整をしなければ、エージェントは通常の速度でリンクをトラバースします。。ISignalOnNavMeshWaypointReached
シグナルをリッスンしてリンクに到達したとき、エージェントをコントロールできます。その後、アニメーションが完了するまでエージェントを無効化するか、 ISignalOnNavMeshMoveAgent
シグナル内の動作コードを上書きします(MovementType
をCallback
にトグルするのにnavmeshコンフィグの変更が要求されます)。
このコードサンプルはリンク開始ウェイポイントを踏むとテレポートを行います。
C#
public void OnNavMeshWaypointReached(Frame f, EntityRef entity, FPVector2 waypoint, Navigation.WaypointFlag waypointFlags, ref bool resetAgent) {
var agent = f.Get<NavMeshPathfinder>(entity);
var waypointIndex = agent.WaypointIndex;
// btw HasFlag() is convenient but slow
if ((waypointFlags & Navigation.WaypointFlag.LinkStart) == Navigation.WaypointFlag.LinkStart) {
// we can be pretty sure that there always is a next waypoint for a link start
var linkDestination = agent.GetWaypoint(f, waypointIndex + 1);
f.Unsafe.GetPointer<Transform2D>(entity)->Position = linkDestination;
}
}
リンクトラバースの例外
- エージェントが
NavMeshPathfinder.IsOnLink(FrameBase)
を使用してリンクをトラバースしている場合、クエリします。 - エージェントがリンクをトラバースしている間に新しいターゲットを設定する場合、エージェントは現在のリンクをパスファインディング実行前に終了します。
WaypointFlag.RepathWhenReached
を設定することで実行されます。 - 最後の前のウェイポイントが
LinkStart
の場合、再パス設定がトリガーされます。リンク開始ウェイポイントが既に到達された場合、再パス設定を実行することで問題を迅速に軽減するのに役立ちます。 - エージェントがリンクをトラバースしている限り、自動再パス設定(
NavMeshAgentConfig.MaxRepathTimeout
)は実行されません。