This document is about: QUANTUM 3
SWITCH TO

Flow Fields Navigation

路徑計算分為兩個主要步驟:

  1. 使用傳送門資料和A*計算路徑;
  2. 計算平滑路徑
Navigation
紅色路徑顯示原始路徑,綠色路徑顯示平滑後的路徑

A* 路徑

地圖上的每個傳送門都是A*圖中的一個節點。兩個傳送門之間的可能路徑表示為A*圖中的邊。當請求路徑時,會將兩個額外的節點(起始位置和目的地)新增到圖中,並將邊連接到流場控制器中可從新節點到達的傳送門。A*的結果是一個傳送門序列,路徑尋找器需要透過這些傳送門才能到達目的地。

平滑路徑

平滑路徑是按代理計算的。目的是去除由A*導航和流場方向(僅8個可能方向)所產生的路徑上不必要的角落。
僅計算平滑路徑的第一個角落,以提高路徑尋找器的性能,這些尋找器可能在到達目的地之前改變目標,這意味著整體路徑將逐漸平滑,並在到達平滑角落時繼續進展。

Navigation
綠色虛線表示A\*的結果。1. 起始位置 2. 當前平滑段 3. 當前平滑角落 4. 目的地

路徑快取

相似的路徑(具有相同起始/結束位置、控制器以及控制器內相同最近傳送門的路徑)會被快取並由路徑尋找器重複使用。

傳送門場

朝向每個傳送門的流是預先計算並在需要時重複使用的。當控制器中的格子成本發生變化,或傳送門的大小/位置發生變化時(當邊界上相鄰控制器的成本變化時),會重新計算。

移動

單位的移動不屬於此附加元件的一部分。FlowFieldPathfinder提供了單位應移動的方向以遵循計算出的路徑。

此範例中包含兩種移動實現:

  1. 簡單移動,直接在 Transform2D 元件中設置位置 - 參見MovementBasic
  2. 更進階的移動,使用 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