This document is about: QUANTUM 2
SWITCH TO

Navmesh Off Mesh Linksを使用する

QuantumはUnity Off Mesh linkをデータ構造内にエキスポートし、navmeshリンクと稼働するのに必要な最小限のサポートを行います。

  • Off Mesh Linkを作成します。QuantumはActivatedプロパティ、Auto Update Positionsプロパティ、Navigation Areaプロパティを無視します。
off mesh link setup
  • マップをベイクして、MapNavMeshDebugDrawerスクリプトを使用し結果のリンクを確認します。リンクは青い矢印としてレンダリングされます。
off mesh link debug
  • エージェントはパスファインディングの間にnavmeshリンクを自動的に使用するようになりました。
off mesh link path gizmo

リンクはトグルオン・オフでき、Quantum navmeshリージョンを使用してエージェントが使用できるものを制限します。Off Mesh LinkにMapNavMeshRegionスクリプトをアタッチして、 IdおよびCast RegionNo Regionに設定します。

off mesh link regions

Hooking-In Gameplay

調整をしなければ、エージェントは通常の速度でリンクをトラバースします。。ISignalOnNavMeshWaypointReachedシグナルをリッスンしてリンクに到達したとき、エージェントをコントロールできます。その後、アニメーションが完了するまでエージェントを無効化するか、 ISignalOnNavMeshMoveAgentシグナル内の動作コードを上書きします(MovementTypeCallbackにトグルするのに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)は実行されません。
Back to top