Flow Fields Map
地圖層級
FlowFieldMap
被劃分為更小的區塊,稱為FlowFieldController
。每個控制器再進一步劃分為格子。

FlowFieldMapUtility
FlowFieldMapUtility
是一個靜態輔助類別,提供實用的方法,例如LineOfSight、將世界座標轉換為地圖位置等。
修改流場地圖
修改現有地圖有兩種方式:
- 設定原始成本 - 用於永久變更地圖上單個格子的成本:
C#
public void SetOriginalTileCost(Frame frame, Vector2Byte location, byte cost)
- 區域成本修改器 - 用於臨時變更,例如即時戰略遊戲中的建築物(可被創建和摧毀)。它會根據參數化的區域應用於一組格子。新增修改器會獲取其整數 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()
的調用。