Flow Fields Navigation
路徑計算分為兩個主要步驟:
- 使用傳送門資料和A*計算路徑;
- 計算平滑路徑

A* 路徑
地圖上的每個傳送門都是A*圖中的一個節點。兩個傳送門之間的可能路徑表示為A*圖中的邊。當請求路徑時,會將兩個額外的節點(起始位置和目的地)新增到圖中,並將邊連接到流場控制器中可從新節點到達的傳送門。A*的結果是一個傳送門序列,路徑尋找器需要透過這些傳送門才能到達目的地。
平滑路徑
平滑路徑是按代理計算的。目的是去除由A*導航和流場方向(僅8個可能方向)所產生的路徑上不必要的角落。
僅計算平滑路徑的第一個角落,以提高路徑尋找器的性能,這些尋找器可能在到達目的地之前改變目標,這意味著整體路徑將逐漸平滑,並在到達平滑角落時繼續進展。

路徑快取
相似的路徑(具有相同起始/結束位置、控制器以及控制器內相同最近傳送門的路徑)會被快取並由路徑尋找器重複使用。
傳送門場
朝向每個傳送門的流是預先計算並在需要時重複使用的。當控制器中的格子成本發生變化,或傳送門的大小/位置發生變化時(當邊界上相鄰控制器的成本變化時),會重新計算。
移動
單位的移動不屬於此附加元件的一部分。FlowFieldPathfinder
提供了單位應移動的方向以遵循計算出的路徑。
此範例中包含兩種移動實現:
- 簡單移動,直接在 Transform2D 元件中設置位置 - 參見
MovementBasic
; - 更進階的移動,使用 PhysicsBody2D 元件 - 參見
MovementAdvanced
。
MovementBasic範例
C#
var pathfinder = frame.GetPointer<FlowFieldPathfinder>(entity);
if (pathfinder->HasDestination == false || pathfinder->AtDestination == true)
return;
var direction = pathfinder->GetDirection(frame, entity);
if (direction.Valid == false)
return;
var transform = frame.GetPointer<Transform2D>(entity);
transform->Position += direction.Direction * Speed * frame.DeltaTime;
MovementAdvanced範例
C#
var pathfinder = frame.GetPointer<FlowFieldPathfinder>(entity);
var physicsBody = frame.GetPointer<PhysicsBody2D>(entity);
if (pathfinder->HasDestination == false || pathfinder->AtDestination == true)
{
physicsBody->Velocity = default;
return;
}
var direction = pathfinder->GetRotationDirection(frame, entity);
if (direction.Valid == false)
{
physicsBody->Velocity = default;
return;
}
physicsBody->Velocity = FPVector2.Rotate(FPVector2.Up, direction.Rotation) * Speed;
physicsBody->WakeUp();
Back to top