Unreal
- ? Unreal Engine - UFloatingPawnMovement
- 🏷 定義
- 🧩 類繼承關系
- ?? 關鍵特性
- 🛠? 常見配置(Details 面板/代碼)
- 📝 使用方法
- 1) 在 Pawn 中添加組件(C++)
- 2) 綁定輸入與驅動移動
- 3) 啟用平面約束(可選)
- 4) 藍圖用法(等價思路)
- 📚 典型應用場景
- 🧯 常見坑與對策
- 🔁 與其他移動組件對比
- 📦 小結
? Unreal Engine - UFloatingPawnMovement
🏷 定義
- UFloatingPawnMovement 是 Pawn 的輕量級移動組件,用于實現“懸浮/漂移式”移動邏輯。
- 典型特征:不受重力、基于輸入 加速/減速,碰撞時沿表面滑移。
- 適合 飛行器/自由鏡頭/無重力物體 等簡單移動需求;不包含角色步行那樣的復雜地面/跳躍/梯子等邏輯。
🧩 類繼承關系
UObject└── UActorComponent└── UMovementComponent└── UNavMovementComponent└── UPawnMovementComponent└── UFloatingPawnMovement└── USpectatorPawnMovement (常見派生:觀戰/自由攝像)
- UPawnMovementComponent:Pawn 移動組件基類(收集輸入、處理速度/位移)。
- UNavMovementComponent:提供導航相關接口(便于與 AI/PathFollowing 協作)。
- USpectatorPawnMovement:基于
UFloatingPawnMovement
的自由相機移動。
?? 關鍵特性
- 簡單輸入驅動:通過
AddInputVector
(通常由AddMovementInput
調用)累計輸入,每 Tick 轉化為速度與位移。 - 加速/減速模型:
- 有輸入 → 以
Acceleration
朝輸入方向加速,最大不超過MaxSpeed
。 - 無輸入 → 按
Deceleration
逐步減速至停下。
- 有輸入 → 以
- 轉向助推(Turning Boost):在低速/急轉彎時加一點“順手感”,更快貼合新方向。
- 平面約束(可選):支持將移動約束到某平面(如 XY 平面用于俯視游戲)。
- 碰撞與滑移:移動通過
SafeMoveUpdatedComponent / SlideAlongSurface
實現,遇到障礙會沿表面滑動。 - 導航/AI 兼容:因繼承自
UNavMovementComponent
,可配合簡單的 AI 移動調用(直線/簡化路徑)。 - 網絡復制:作為 Pawn 的移動組件,配合 Pawn 的
bReplicates / SetReplicateMovement(true)
可進行基礎同步。
🛠? 常見配置(Details 面板/代碼)
MaxSpeed
:最大速度。Acceleration
:有輸入時的加速度。Deceleration
:無輸入時的減速度(制動)。TurningBoost
:轉向助推(數值越大拐向越“利落”)。- 平面約束相關(在 MovementComponent 上):
bConstrainToPlane
/SetPlaneConstraintEnabled(true)
SetPlaneConstraintNormal(FVector::UpVector)
(約束到水平面)bSnapToPlaneAtStart
(開局吸附到平面)
提示:這些參數可在藍圖/Details 面板直接調,快速打磨“手感”。
📝 使用方法
1) 在 Pawn 中添加組件(C++)
// MyFloatingPawn.h
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components")
UFloatingPawnMovement* Movement;// MyFloatingPawn.cpp (構造函數)
Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("Movement"));
Movement->UpdatedComponent = RootComponent; // 通常設為你的碰撞體/根組件
2) 綁定輸入與驅動移動
// Pawn::SetupPlayerInputComponent
InputComponent->BindAxis("MoveForward", this, &AMyFloatingPawn::MoveForward);
InputComponent->BindAxis("MoveRight", this, &AMyFloatingPawn::MoveRight);
InputComponent->BindAxis("Turn", this, &AMyFloatingPawn::Turn);// 實現:把輸入轉成移動/旋轉
void AMyFloatingPawn::MoveForward(float Value) {if (Value != 0.f) AddMovementInput(GetActorForwardVector(), Value);
}
void AMyFloatingPawn::MoveRight(float Value) {if (Value != 0.f) AddMovementInput(GetActorRightVector(), Value);
}
void AMyFloatingPawn::Turn(float Value) {AddControllerYawInput(Value); // 讓控制器驅動朝向
}
3) 啟用平面約束(可選)
Movement->SetPlaneConstraintEnabled(true);
Movement->SetPlaneConstraintNormal(FVector::UpVector); // 約束到 XY 平面
Movement->bSnapToPlaneAtStart = true;
4) 藍圖用法(等價思路)
- 在 Pawn 藍圖里添加 FloatingPawnMovement 組件。
Add Movement Input
節點驅動移動;在Project Settings → Input
配好 Axis。- 可在 Details 面板直接修改
Max Speed / Acceleration / Deceleration / Turning Boost
。 - 若只想在平面移動,開啟 Constrain to Plane 并設置法線為
Z+
。
📚 典型應用場景
- 🎥 自由相機 / 觀戰模式(Spectator)。
- 🚀 俯視/雙搖桿射擊(Top-Down/ Twin-stick)。
- 🛰 飛行/無人機/太空漂移(無重力直覺式推進)。
- 🧭 簡單 AI 追逐/巡邏(直線或簡化路徑,無復雜地形邏輯)。
🧯 常見坑與對策
-
物理模擬沖突:如果
UpdatedComponent
(通常是碰撞體)開啟了 Simulate Physics,移動組件將無法直接驅動;→ 關閉物理模擬,或改用物理力/
UProjectileMovementComponent
等方案。 -
沒動起來:
- 確認
Movement->UpdatedComponent
指向可移動的根/碰撞組件; - 軸映射是否正確(
Project Settings → Input
); - Pawn 是否被玩家/AI Possess(或
Auto Possess Player
)。
- 確認
-
卡墻角/抖動:適當調碰撞形狀、步長、
Deceleration
和TurningBoost
,避免高頻改變方向導致貼壁震蕩。 -
需要重力/復雜步行:
UFloatingPawnMovement
不提供地面檢測/坡度/跳躍;→ 使用
UCharacterMovementComponent
(帶完整角色移動模型)。
🔁 與其他移動組件對比
組件 | 特點 | 適用 |
---|---|---|
UFloatingPawnMovement | 無重力、加減速、滑移,輕量好調手感 | 飛行/自由鏡頭/Top-Down |
UCharacterMovementComponent | 完整步行/跳躍/地面邏輯,最復雜 | 玩家角色/NPC |
UProjectileMovementComponent | 給物體初速度/重力/反彈 | 子彈/拋射體 |
URotatingMovementComponent | 讓組件/Actor 按固定角速度旋轉 | 環境機關/旋轉裝飾 |
📦 小結
- UFloatingPawnMovement = 輕量級懸浮移動
- ? 輸入驅動 + 加減速 + 碰撞滑移
- ? 可選平面約束,快速做俯視/飛行感
- ? 適合自由相機/飛行器/Top-Down,不適合帶重力的地面角色
- ? 與 Pawn/AI/網絡基礎復制配合良好,易于上手與調參