This document is about: QUANTUM 3
SWITCH TO

オフメッシュリンクの使用

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を作成し調整します。
    Off Mesh Link Setup
  • Quantumナビメッシュをベイクし、リンクが青い矢印のギズモで表示されていることを確認します。(Quantum GizmosオーバーレイメニューからNavMeshLinksを有効にして、QuantumMapDataゲームオブジェクトを選択)
    Nav Mesh Link Gizmo
  • これでエージェントが経路探索でリンクを考慮するようになります。
    Nav Mesh Link Path

実行時にナビメッシュリンクを切り替える

Quantumナビメッシュリージョンを使用して、リンクのオン/オフを切り替えることができます。リンクはリージョンIDでベイクされ、グローバルまたはエージェント毎に切り替えられます。詳細な情報はリージョンをご覧ください。

Simpleリージョンモード

UnityのNavMesh LinkArea Typeを選択して、リージョンを設定します。

Advancedリージョンモード

  • UnityのNavMesh LinkArea Typeを選択して、リージョン検知エリアに設定します。
  • UnityのNavMesh LinkMapNavMeshRegionスクリプトをアタッチし、リージョンIdを設定、Cast RegionNo Regionに設定します。
Off Mesh Link Regions

カスタマイズとシグナル

リンクのデータ構造は、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.MovementTypeCallbackに設定する必要があります。エージェントのコンフィグは実行時に変更可能です。

以は、エージェントがリンク開始のウェイポイントに到達した際にテレポートを実行するサンプルコードです。

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