This document is about: QUANTUM 3
SWITCH TO

Flow Fields Map

地圖層級

FlowFieldMap被劃分為更小的區塊,稱為FlowFieldController。每個控制器再進一步劃分為格子。

Map Hierarchy
一個尺寸為 32x32、控制器大小為 8 的地圖範例。

FlowFieldMapUtility

FlowFieldMapUtility是一個靜態輔助類別,提供實用的方法,例如LineOfSight、將世界座標轉換為地圖位置等。

修改流場地圖

修改現有地圖有兩種方式:

  1. 設定原始成本 - 用於永久變更地圖上單個格子的成本:

C#

public void SetOriginalTileCost(Frame frame, Vector2Byte location, byte cost)
  1. 區域成本修改器 - 用於臨時變更,例如即時戰略遊戲中的建築物(可被創建和摧毀)。它會根據參數化的區域應用於一組格子。新增修改器會獲取其整數 ID,後續可用於輕鬆移除相同的修改器:

C#

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

地圖創建

FlowFieldMap在運行時創建並存儲於 FrameContext 中。

參數

  • 尺寸 - 地圖的 (X, Y) 大小。支援的最大尺寸為 256x256;
  • 瓦片大小 - 每個瓦片的尺寸;
  • 控制器大小 - 地圖子分區的大小(地圖的 尺寸 必須是 控制器大小 的倍數)。建議的 控制器大小 介於 8 到 20 之間;
  • 最大傳送門長度 - 連接兩個相鄰控制器的傳送門的最大長度。如果 最大傳送門長度 大於 控制器大小,則兩個控制器之間可以有多個傳送門。傳送門越多,精度越高,但 CPU 速度會變慢;
  • 成本場 - 單個瓦片的成本。

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在大型地圖中可能包含大量資料,因此不適合將此類資料存儲在幀中。
FlowFieldMap 存儲於 FrameContext 中,這意味著對其的修改必須非常謹慎。為避免客戶端之間出現不同步,必須僅在「已驗證幀」中修改它。
過大的幀大小可能導致性能下降,且重新加入或遲加入的序列化資料可能因傳輸量過大而無法處理(FlowFieldMap 具有自定義序列化功能,可緩解此問題)。

遲加入與重新連接

由於FlowFieldMap不是幀的一部分,它實現了自定義序列化 - 參見FlowFieldMap.Serialize()

預設情況下,附加元件在Frame.User.cs中的部分SerializeUser實現中提供了對此序列化方法的調用。使用附加元件時,請確保此代碼未被移除。您可以按照附加元件提供的代碼使用,或者如果您已有自定義代碼,請在SerializeUser方法中新增FlowFieldMap.Serialize()的調用。

Back to top