This document is about: QUANTUM 2
SWITCH TO

フローフィールドマップ


Available in the Gaming Circle and Industries Circle
Circle

マップのヒエラルキー

FlowFieldMapは、FlowFieldControllerという名の細かいチャンクに分けられます。 各コントローラはタイルに分けられます。

map hierarchy
マップのサンプル。(dimensions 32x32、controller size 8)

FlowFieldMapUtility

FlowFieldMapUtilityは、LineOfSightのような便利なメソッドを持つ静的ヘルパークラスで、ワールドのポジションからマップのロケーションなどまでをカバーします。

フローフィールドマップを修正する

既存のマップを修正するには2通りの方法があります。

  1. 各タイルのコストを変更(マップ上の単独のタイルの永続的なコスト変更に使用):

C#

public void SetOriginalTileCost(Frame frame, Vector2Byte location, byte cost)
  1. コストモディファイヤ(一時的な変更に使用。RTSでのビルドなど):

C#

public int AddCostModifier(Frame frame, FPVector2 minPosition, FPVector2 maxPosition, byte cost)
public bool RemoveCostModifier(Frame frame, int modifierID)
  1. エリアコストモディファイヤ - RTS ビルディング(作成可能かつ破壊可能なもの) などの一時的な変更に使用されます。これはパラメータ化された領域に基づいてタイルのグループに適用されます。モディファイヤを追加するとその整数IDが取得され、さらに同じモディファイヤを簡単に削除するのに使用できます:

C#

public int AddCostModifier(Frame frame, FPVector2 minPosition, FPVector2 maxPosition, byte cost)
public bool RemoveCostModifier(Frame frame, int modifierID)

マップ作成

FlowFieldMapは実行時に作成され、FrameContextに保管されます。

パラメータ

  • Dimensions - マップの(X, Y) サイズ。サポートされる最大サイズは256x256です;
  • Tile Size - 各タイルのサイズ;
  • Controller Size - マップのサイズのサブディビジョン (マップのDimensionsController Sizeの倍数である必要があります)。推奨されるController Sizeは8から20の間です;
  • Max Portal Length - 隣接する2つのコントローラーに接続しているポータルの最大長。Max Portal LengthController sizeよりも大きい場合には、2つのコントローラー間に複数のポータルが存在する可能性があります。ポータルが増えると精度が増しますが、CPU上は遅くなります;
  • Cost Field - 各タイルのコスト。

C#

var ffMap = new FlowFieldMap(new Vector2Int(16, 16), FP._2, 8, 4, COSTS);
ffMap.Initialize(frame.SimulationConfig.ThreadCount, false);

frame.Context.FlowFieldMap = ffMap;

マップデータ

フレームコンテキスト

FlowFieldMapは、大きなマップの場合に多くのデータを保持することができるので、そのようなデータをFrame内に保持するのは適切ではありません。 FlowFieldMapはFrameContextに保存されるため、変更は非常に慎重におこなう必要があります。クライアント間の非同期を防ぐため、検証されたフレームでのみ変更することが重要です。 フレームサイズが大きすぎるとパフォーマンスが低下し、再参加または遅れて参加するためのシリアライズデータが大きすぎて転送できない可能性があります(FlowFieldMapはこの問題を軽減するカスタムシリアライズを備えています)。

遅れて参加および再接続

FlowFieldMapはフレームの一部ではないため、カスタムのシリアライズを実装します - FlowFieldMap.Serialize()を参照してください。

Back to top