角色操作

目標

從頭使用 unreal MetaHuman 建立角色並製作角色移動相關功能

功能

  • 前後左右移動

  • 跳躍

  • 蹲下

  • 閃躲

  • 掛越障礙物

使用 MetaHuman

在 Epic 啟動器中將 metahuman 的安裝選項勾選並下載 Edit > Plugins > 安裝metahuman 相關插件 並新增角色

我這邊直接選取範本

要輸出能可用的檔案 需要 download Texture Source 並 create Full Rig

後續會輸出一個 Actor 的 blue Print * 這邊我點開檔案後反覆 crash 改成 DX11 才好

在 Unreal Engine 5 中設定專案使用的 DirectX 版本:

  • 路徑:在編輯器上方選單,依次點擊 Edit > Project Settings > Platforms > Windows > Targeted RHIs

  • 設定項:在 Targeted RHIs,可選擇下列渲染硬體介面(RHI):

    • DirectX 11

    • DirectX 12

    • Vulkan

在 Actor BluePrint 中 Class Settings

Parent class 改成 Character

到這邊就可以使用基本的角色了

動畫

這邊可以直接使用 Unreal 自帶的 Mannequin 中的動畫很方便 使用 Replace Skeleton 至換掉骨架就可以直接用了

基本功能

前後左右移動 滑鼠控制鏡頭 跳

基本元件

SpringArm(彈簧臂)組件在 Unreal Engine 中的作用是:

  • 相機延伸與碰撞偵測:讓相機跟隨角色,但當相機位置被物件阻擋時,自動縮短距離避免穿透牆壁或地形,提升視覺體驗。

  • 平滑運動:通過啟用相機延遲(Camera Lag),使相機移動較角色稍慢,達成更自然、流暢的鏡頭跟隨效果。

  • 旋轉控制:可設定是否繼承父物件(如角色 Pawn)的旋轉,實現第三人稱相機跟隨玩家視角。

  • 組件附件點:SpringArm 提供一個末端插座,方便將相機等組件掛載於其末端。

總結:SpringArm 是一個幫助你設定第三人稱相機距離、避免穿透、並創造平滑跟隨動作的便利組件。

設定 camera 讓 camera 旋轉時 不讓 Character 旋轉

1. Orient Rotation To Movement(CharacterMovement Component)

  • 作用:讓角色自動面向當前移動方向。

  • 用途:適用於第三人稱或頂視角遊戲,角色轉向方向跟隨移動路徑,與控制器旋轉無關。

  • 效果:角色會根據移動向量旋轉,不直接受控制器角度影響。

2. Use Controller Desired Rotation(CharacterMovement Component)

  • 作用:告訴角色移動系統根據控制器的期望旋轉(DesiredRotation)來旋轉角色。

  • 用途:適合需要角色朝向控制器指向方向的遊戲,例如第一人稱或需要角色直接面對視角方向。

  • 效果:角色會朝控制器想轉向的方向旋轉,常與 bUseControllerRotationYaw 配合使用。

3. bUseControllerRotationYaw(Actor 層級屬性)

  • 作用:定義角色是否自動繼承控制器的 Yaw(水平旋轉)值。

  • 用途:若設定為 true,角色會隨控制器水平方向旋轉;若為 false,角色不跟隨控制器旋轉,旋轉可由其他方式控制。

  • 影響:直接影響角色面朝方向,常用於調整輸入如何反映在角色身上。

綜合說明

設定
角色旋轉控制來源
通常用於
互動關係

Orient Rotation To Movement

移動方向(Vector)

第三人稱、自動面向移動

開啟時忽略控制器旋轉

Use Controller Desired Rotation

控制器期望旋轉

需要角色隨控制器面向的遊戲

常與 bUseControllerRotationYaw 一起使用

bUseControllerRotationYaw

是否繼承控制器的水平旋轉

角色視角同步

為 true 時角色跟隨控制器旋轉

你可能想的設定範例:

  • 第三人稱自動面向移動方向角色

    • Orient Rotation To Movement = true

    • bUseControllerRotationYaw = false

    • Use Controller Desired Rotation = false

  • 第一人稱或跟隨視角角色

    • Orient Rotation To Movement = false

    • bUseControllerRotationYaw = true

    • Use Controller Desired Rotation = true

前後左右移動

1. 輸入 (Move Node)

  • 左側的紫色 Move 節點代表一個 Action/Axis Input 事件,通常與鍵盤上的 W, A, S, D 或遊戲手柄的搖桿相關聯。

    • XX Axis (左右軸):這個綠色引腳的輸出值通常是 -1.0 (左移,如 A 鍵) 到 1.0 (右移,如 D 鍵) 之間。

    • YY Axis (前後軸):這個綠色引腳的輸出值通常是 -1.0 (後退,如 S 鍵) 到 1.0 (前進,如 W 鍵) 之間。


2. 左右移動 (Left/Right)

這部分處理角色的左右平移 (Strafe) 輸入。

節點名稱

節點功能

核心作用

Get Control Rotation

獲取當前角色的 控制器 (Controller) 的旋轉值 (Yaw, Pitch, Roll)。

獲取玩家的視角方向,這是關鍵,因為我們希望「右」是相對於玩家當前面對方向的右邊。

Get Right Vector

輸入 Control Rotation,輸出一個 Vector (向量)。這個向量指向角色控制器所定義的 世界空間中的右側方向。

將旋轉值轉換為 世界方向。這個向量的長度是 1.0 (單位向量)。

Add Movement Input

Unreal Engine 用來向一個 Pawn (Pawn/Character) 添加推力/移動的標準節點。

實際執行移動。

  • World Direction (世界方向):連接到 Get Right Vector 的輸出。它告訴 Add Movement Input 應該朝哪個方向施加移動。

  • Scale Value (縮放值):連接到輸入的 XX Axis。這個值 (±1.0±1.0) 會乘上 World Direction

    • 如果 XX Axis 是 1.0 (按 D 鍵),角色向右向量方向移動。

    • 如果 XX Axis 是 -1.0 (按 A 鍵),角色向右向量的反方向(即左方)移動。

3. 前進/後退 (Forward/Backward)

這部分處理角色的前進和後退輸入。邏輯與左右移動非常相似,但使用了不同的方向向量。

節點名稱

節點功能

核心作用

Get Control Rotation

獲取當前角色的控制器旋轉值。

獲取玩家的視角方向。

Get Forward Vector

輸入 Control Rotation,輸出一個 Vector (向量)。這個向量指向角色控制器所定義的 世界空間中的前方方向。

將旋轉值轉換為 世界方向

Add Movement Input

標準的移動執行節點。

實際執行移動。

  • World Direction (世界方向):連接到 Get Forward Vector 的輸出。

  • Scale Value (縮放值):連接到輸入的 YY Axis。

    • 如果 YY Axis 是 1.0 (按 W 鍵),角色向前向量方向移動。

    • 如果 YY Axis 是 -1.0 (按 S 鍵),角色向前向量的反方向(即後方)移動。

滑鼠轉動視角

1. 輸入 (Aim Node)

  • 左側的紫色 Aim 節點代表一個 Axis Input 事件,通常與 滑鼠的 XXYY 軸移動 或 遊戲手柄的右搖桿 相關聯。

    • XX Axis (左右軸):這個綠色引腳的輸出值反映了滑鼠的水平移動(通常用於左右旋轉視角)。

    • YY Axis (上下軸):這個綠色引腳的輸出值反映了滑鼠的垂直移動(通常用於上下旋轉視角)。


2. 左右旋轉 (Left/Right)

這部分處理水平方向的視角移動,即 偏航 (Yaw) 旋轉。

節點名稱

節點功能

核心作用

Add Controller Yaw Input

這是 Unreal Engine 專門用於控制角色 控制器 (Controller) 在 Z 軸 (垂直軸) 上旋轉的節點。Yaw 是偏航角,即水平旋轉。

將水平輸入轉換為視角或角色繞著世界 ZZ 軸的左右旋轉。

  • Val (數值):連接到輸入的 XX Axis。

    • 當滑鼠向右移動時,XX Axis 為正值,控制器向右旋轉。

    • 當滑鼠向左移動時,XX Axis 為負值,控制器向左旋轉。

💡 注意:如果角色是標準的第三人稱或第一人稱設置,改變 控制器 (Controller) 的 Yaw 角會讓整個角色/攝影機在水平面上旋轉。

3. 上下旋轉 (Up/Down)

這部分處理垂直方向的視角移動,即 俯仰 (Pitch) 旋轉。

節點名稱

節點功能

核心作用

Add Controller Pitch Input

這是 Unreal Engine 專門用於控制角色 控制器 (Controller) 在 Y 軸 (橫向軸) 上旋轉的節點。Pitch 是俯仰角,即垂直旋轉。

將垂直輸入轉換為視角或攝影機的上下旋轉。

  • Val (數值):連接到輸入的 YY Axis。

    • 當滑鼠向上移動時,YY Axis 的值會導致視角向上或向下移動(取決於輸入設置和是否反轉)。

    • 當滑鼠向下移動時,YY Axis 的值會導致視角向下或向上移動。

💡 注意:通常,Pitch 角只會影響 攝影機 的旋轉,而不會影響角色的 移動方向(除非是飛行遊戲)。這允許玩家抬頭或低頭看,而不會改變角色在地面上的移動方向。

1. Enhanced Input Action (IA_Jump)

這個紅色的節點 EnhancedInputAction IA_Jump 是 Enhanced Input System 中的一個輸入事件節點。它代表了玩家定義的「跳躍」動作(例如,在 Input Mapping Context 中將空格鍵映射到這個動作)。

這個節點有幾個關鍵的執行引腳 (Execution Pins),用於定義事件在不同狀態下應執行的動作:

執行引腳

說明

藍圖連接

核心作用

Started

當輸入動作剛開始時觸發(例如,玩家按下空格鍵的第一幀)。

連接到 Jump 節點。

開始跳躍。

Completed

當輸入動作完成時觸發(例如,玩家放開空格鍵)。

連接到 Stop Jumping 節點。

停止跳躍或中斷跳躍。

Triggered

動作正在進行中(對於按鈕輸入,這通常與 Started 相似,但在某些設置中可能用於持續動作)。

(在此圖中未使用)

2. Jump 節點

  • 節點名稱:Jump (Target is Character)

  • 功能:這是 Unreal Engine Character 類別內建的一個函數。它會根據 Character Movement Component 中的設定(如 Jump Z Velocity)使角色向上跳躍。

  • 觸發時機:當 EnhancedInputAction IA_Jump 的 Started 引腳觸發時,角色開始跳躍。

3. Stop Jumping 節點

  • 節點名稱:Stop Jumping (Target is Character)

  • 功能:這是 Unreal Engine Character 類別內建的一個函數。它會立即停止角色的當前跳躍狀態。

  • 觸發時機:當 EnhancedInputAction IA_Jump 的 Completed 引腳觸發時,角色停止跳躍。

按住跳躍 (Press-and-Hold Jump):如圖片上方的文字說明所指,Stop Jumping 的存在是為了實現這一高級功能:

  • 玩家按住跳躍鍵,角色可以跳到預設的最大高度。

  • 玩家提早放開跳躍鍵,Stop Jumping 會立即被調用,中斷上升階段,使角色跳得更低。

蹲下

建立 Crouched 參數 讓後續動畫的部分能進行使用

Can Crouch 要打開 Crouch function 才會奏效

當 Crouch 時會調整膠囊高度為 60

並且設定最大速度為 300

動畫

Event Graph

Anim Graph

基本解說

Event Graph 取得 Character

Speed 移動速度

is Crouched 是否蹲下

is Falling 是否往下掉

Anim Graph

狀態機管理並切換動畫

當在 idle 狀態時 按下 ctrl isCrouch = true 進入 crouch 狀態

並在 speed > 0 進入 Crouch Move

當在 idle 狀態時 進行移動 進入 walk/ run 狀態

並在停下時切換回 stop -> idle

在 idle / walk 按下 space 會進行 jump 狀態

並在落地後回到 idle

如果在切換狀態時 不需要條件判斷 動畫播完後直接切換的話

Automatic Rule Based on Sequence Player in state 要打勾

優化

將 move 和 crouch 封裝成一個類似 function 的 state machine

輸出選擇 new save cached pose

在需要使用的地方 add state 並放入 cache 使用

InJump 是 state Alias

可以透過選擇 state 決定可以進入這部分的狀態

這邊的意思是在 move 的情況下 按下 space 就會進入跳躍狀態

Last updated