)
這次我們來看一個UE5.7戰斗系統開發的實戰項目。核心不是講一堆虛幻引擎的復雜概念而是直接上手在UE5.7里搭建一套可玩、可擴展的戰斗框架重點解決連擊、命中判定和傷害反饋這三個核心體驗問題。對于想做動作游戲、ARPG或者想深入理解UE5動畫和物理交互的開發者來說這套流程可以直接復用。本文會帶你從零開始在UE5.7中搭建一個基礎的第三人稱戰斗場景。我們會重點實現1基于動畫蒙太奇和狀態機的連擊系統2使用碰撞盒Box Collision和射線檢測Line Trace進行精準的命中判定3集成傷害數值顯示、受擊動畫、屏幕震動和音效的完整傷害反饋鏈。整個過程會避開華而不實的功能聚焦于每個環節的藍圖實現、參數調試和性能觀察確保你在自己的項目里能快速跑通。1. 核心能力速覽能力項說明引擎版本Unreal Engine 5.7 (部分邏輯兼容5.3)核心功能連擊動畫銜接、近戰攻擊命中判定、多維度傷害反饋關鍵技術動畫蒙太奇、動畫藍圖狀態機、碰撞盒/射線檢測、UMG UI、相機震動硬件門檻主要依賴CPU和GPU進行實時渲染與物理計算建議GTX 1060 / RTX 2060及以上顯卡確保流暢運行編輯器項目復雜度中等涉及動畫系統、藍圖編程和UI集成適合有一定UE基礎或想系統學習戰斗邏輯的開發者輸出目標獲得一個可運行、可測試、模塊清晰的戰斗原型便于后續擴展為更復雜的技能系統2. 適用場景與使用邊界這套戰斗系統實戰主要適用于以下幾類開發者獨立游戲開發者/小型團隊需要快速驗證戰斗手感搭建原型。UE學習進階者已經熟悉基礎操作想深入動畫系統、事件交互和游戲邏輯的整合。動作/ARPG項目作為近戰戰斗模塊的基礎后續可擴展技能、格擋、彈反等機制。它能解決的核心問題是如何將動畫、輸入、物理碰撞和游戲反饋有機地串聯起來形成一個手感扎實的戰斗循環。你將學會如何讓角色“打得出連招”、“砍得中敵人”以及“打得有反應”。需要注意的是本實戰側重于系統實現框架與核心邏輯而非頂級3A游戲的畫面表現或極其復雜的動畫融合技術。它不包含高級動畫技巧如運動匹配Motion Matching、復雜的骨骼IK調整。網絡同步本文為單機實現多人游戲需要額外處理客戶端預測、服務器校驗等。完整的AI系統敵人行為僅為簡單的受擊反應復雜的AI決策樹、行為樹需要另行開發。商業化素材使用的動畫、音效、模型僅為演示目的實際項目需確保使用擁有合法授權的素材。3. 環境準備與前置條件在開始搭建之前請確保你的開發環境已就緒。1. 引擎與項目Unreal Engine 5.7從Epic Games啟動器安裝或源碼編譯。5.7版本在動畫通知、編輯器穩定性方面有較好支持。新建項目建議選擇“第三人稱游戲(Third Person)”模板并啟用“初學者內容包(Starter Content)”。項目名稱如CombatSystemDemo。2. 內容準備動畫資源你需要一套基礎的攻擊動畫??梢栽谔摶蒙坛撬阉髅赓M資源如“Infinity Blade: Warriors”的動畫包或使用項目模板自帶的動畫進行改編。至少準備Idle待機、Attack1攻擊1、Attack2攻擊2、Attack3攻擊3、GetHit受擊。音效與UI素材準備刀劍揮砍音效、命中音效、UI提示音以及顯示傷害數字的字體和材質。初學者內容包中可找到一些基礎資源。敵人模型一個簡單的角色或靜態網格體如“第三人稱”模板中的目標靶子即可。3. 知識預備基本熟悉UE編輯器界面內容瀏覽器、世界大綱、細節面板。了解藍圖Blueprint的基本操作創建變量、函數、事件圖表。對動畫藍圖Animation Blueprint和狀態機有初步概念。4. 項目結構與核心藍圖創建清晰的架構是后續高效開發的基礎。我們先建立核心藍圖。4.1 創建文件夾結構在內容瀏覽器中創建如下文件夾以管理資產Content/ ├── Blueprints/ │ ├── Characters/ │ ├── Enemies/ │ └── UI/ ├── Animations/ │ ├── Player/ │ └── Enemy/ ├── AnimationBlueprints/ ├── UI/ ├── Sounds/ └── Materials/4.2 創建玩家角色藍圖在Blueprints/Characters/文件夾中右鍵選擇“藍圖類”。父類選擇Character命名為BP_CombatPlayer。雙擊打開在“組件”面板中確保已有SkeletalMesh、SpringArm、Camera等組件。我們需要添加攻擊碰撞盒。在組件面板點擊“添加組件”搜索并添加Box Collision重命名為AttackCollisionBox。將AttackCollisionBox附著到武器骨骼或手部骨骼上例如hand_r。在細節面板中調整其位置和大小使其覆蓋武器的攻擊范圍。關鍵一步在碰撞預設Collision Presets中將其設置為NoCollision或自定義一個如OverlapAll的預設避免與角色自身碰撞。同時在“碰撞”分類下取消勾選“生成重疊事件(Generate Overlap Events)”的默認狀態我們將通過藍圖在攻擊時動態啟用它。4.3 創建敵人藍圖在Blueprints/Enemies/中創建藍圖類父類選擇Character或Actor簡單演示可用Actor命名為BP_SimpleEnemy。為其添加一個StaticMesh組件作為外觀并添加一個Box Collision組件作為受擊盒重命名為HitCollisionBox。4.4 創建動畫蒙太奇動畫蒙太奇是驅動單次攻擊動畫的載體并能嵌入通知Notifies來觸發事件如開啟碰撞盒。在Animations/Player/文件夾中右鍵你的攻擊動畫序列如Attack1選擇“創建” - “創建動畫蒙太奇”。命名為AM_AttackCombo。雙擊打開蒙太奇編輯器。將動畫序列拖入軌道。在“通知軌道(Notifies Track)”上右鍵添加通知。我們需要兩個關鍵通知EnableHitBox在武器揮出即將接觸敵人的時刻添加用于開啟攻擊碰撞盒。DisableHitBox在攻擊動畫收招或結束時添加用于關閉攻擊碰撞盒避免一幀內多次觸發。我們需要先創建這兩個自定義通知。在內容瀏覽器中右鍵選擇“動畫” - “動畫通知”分別創建AnimNotify_EnableHitBox和AnimNotify_DisableHitBox。然后回到蒙太奇編輯器將它們從資源列表拖到通知軌道上。5. 連擊系統實現輸入、狀態與動畫銜接連擊系統的核心是管理玩家的輸入隊列、當前連擊段數以及控制動畫的播放邏輯。5.1 設置玩家輸入與變量打開BP_CombatPlayer的事件圖表。定義變量ComboCount(整數)當前連擊數初始為0。bCanAttack(布爾)是否可以觸發下一次攻擊初始為True。用于防止動畫播放期間重復輸入。AttackMontage(動畫蒙太奇對象引用)存儲我們創建的AM_AttackCombo。綁定輸入在“項目設置 - 輸入”中添加一個“動作映射(Action Mappings)”命名為Attack綁定到鼠標左鍵或鍵盤按鍵如J。處理輸入事件在BP_CombatPlayer的事件圖表中右鍵搜索“輸入動作 Attack”添加該事件。編寫邏輯檢查bCanAttack是否為 True。如果為真設置bCanAttack為 False防止連點。根據ComboCount的值通過Play Montage節點播放AttackMontage。同時需要設置蒙太奇的播放速率和起始位置通常連擊的后續攻擊會更快。在播放蒙太奇后增加ComboCount。例如如果ComboCount大于等于3假設是三連擊則重置為0。關鍵需要監聽蒙太奇播放完成或中斷的事件。使用OnCompleted和OnInterrupted輸出引腳在這些事件中重置bCanAttack為 True并考慮是否重置ComboCount。通常如果連擊成功銜接ComboCount不重置如果攻擊動作被打斷或長時間未輸入則需要重置。這可以通過一個定時器來實現“連擊窗口期”。5.2 在動畫藍圖中管理連擊狀態玩家角色的動畫藍圖通常為ABP_Player是控制播放哪一段攻擊動畫的最佳位置。打開角色的動畫藍圖進入動畫圖表AnimGraph。創建一個狀態機命名為AttackStateMachine。雙擊進入狀態機創建多個狀態Idle、Attack1、Attack2、Attack3。轉換規則從任何狀態到Attack1當ComboCount等于1時。從Attack1到Attack2需要一個條件例如檢測到在Attack1動畫的特定幀通過時間或通知有新的攻擊輸入并且ComboCount變為2。以此類推。每個攻擊狀態結束時如果沒有滿足進入下一段的條件則轉換回Idle并重置ComboCount。將AttackStateMachine的輸出連接到最終動畫姿勢的輸出節點。同時需要將待機、移動等狀態也通過一個主狀態機或混合節點與之混合。更實用的簡化方案對于快速原型可以不在動畫藍圖做復雜狀態判斷而是在角色藍圖中根據ComboCount直接播放AM_AttackCombo蒙太奇的不同片段通過Play Montage節點的Start Section參數指定節名稱。在蒙太奇中為每一段攻擊設置不同的節Section如Attack1,Attack2,Attack3。6. 命中判定實現碰撞盒與射線檢測命中判定決定了“這一刀有沒有砍中”。我們采用“碰撞盒檢測”作為主要方法并簡要介紹“射線檢測”作為補充或替代方案。6.1 碰撞盒檢測流程創建自定義動畫通知之前創建的AnimNotify_EnableHitBox需要有其邏輯。雙擊打開它的藍圖。在事件Received_Notify中我們需要獲取到擁有此骨骼網格體的角色Owner Actor并轉換為BP_CombatPlayer。轉換成功后調用玩家角色上的一個自定義函數例如EnableAttackCollision()。在BP_CombatPlayer中創建函數EnableAttackCollision此函數中設置AttackCollisionBox組件的“生成重疊事件”為 True。同時綁定該碰撞盒的OnComponentBeginOverlap事件。處理重疊事件當AttackCollisionBox開始與某物體重疊時檢查重疊的另一個組件Other Comp的所有者Other Actor是否是敵人例如檢查其類是否是BP_SimpleEnemy或實現了某個“可受擊”接口。如果是敵人并且當前敵人不在一個“已命中列表”中防止單次攻擊對同一敵人造成多次傷害則執行命中邏輯。命中邏輯包括調用敵人身上的ApplyDamage函數或直接廣播傷害事件、播放命中特效、音效等。將命中的敵人加入“已命中列表”。關閉碰撞盒在AnimNotify_DisableHitBox的通知中調用玩家角色的DisableAttackCollision函數。此函數將“生成重疊事件”設為 False并清空“已命中列表”為下一次攻擊做準備。6.2 射線檢測作為備選對于需要更精準、如劍氣、刺擊等判定可以使用射線檢測。在攻擊動畫的關鍵幀通過動畫通知觸發一個執行射線檢測的函數。函數中從武器尖端或手部骨骼位置向攻擊方向發射一條射線LineTraceByChannel。檢測通道Trace Channel可以設置為自定義的Weapon通道并為敵人的受擊盒設置對該通道的響應。如果射線命中敵人則執行與碰撞盒檢測相似的命中邏輯。 射線檢測的優點是無須持續存在的碰撞體性能開銷可控且判定精準。缺點是無法很好地處理持續范圍的揮砍。7. 傷害反饋系統讓戰斗“有感覺”命中之后需要讓玩家和敵人都感受到“打中了”。這是一個多感官的反饋系統。7.1 敵人受擊反饋傷害處理在BP_SimpleEnemy中創建一個浮點變量Health初始值為100.0。創建一個函數ApplyDamage(float DamageAmount)。在該函數中減少Health。如果Health 0播放死亡動畫或銷毀Actor。受擊動畫在敵人動畫藍圖中添加一個HitReaction狀態。當接收到傷害時可以通過事件分發器或直接調用強制切換到受擊動畫蒙太奇播放一次然后返回原狀態。受擊特效與音效在ApplyDamage函數中在敵人位置生成一個粒子特效如火花并播放受擊音效。7.2 玩家屏幕反饋相機震動命中敵人時在玩家控制器或相機管理器上調用PlayCameraShake節點。你需要先創建一個相機震動資產Camera Shake。在內容瀏覽器中右鍵選擇“創建高級資源” - “相機” - “相機震動基類”選擇LegacyCameraShake或CameraShakeBase的子類并調整震動的強度、頻率和持續時間。命中停頓Hit Pause為了增強打擊感可以在命中瞬間讓游戲時間短暫變慢。使用Set Global Time Dilation節點將全局時間膨脹設置為一個小于1的值如0.1持續0.1秒然后恢復為1.0。注意這會影響到所有基于時間的邏輯。7.3 UI傷害數字創建傷害數字控件在UI/文件夾創建“用戶控件(Widget Blueprint)”命名為WBP_DamageNumber。設計控件添加一個文本塊Text Block綁定一個浮點變量DamageValue。可以添加動畫讓文字從命中點向上飄移并漸隱。生成傷害數字在命中判定邏輯中玩家藍圖的OnComponentBeginOverlap事件里創建這個控件到屏幕。使用Create Widget節點創建WBP_DamageNumber。將傷害值傳遞給它。使用Add to Viewport添加到視口。為了將世界空間中的命中位置轉換到屏幕空間需要使用Project World Location to Screen節點將得到的屏幕位置設置給控件的初始位置。8. 集成測試與效果驗證現在我們將所有模塊串聯起來在編輯器中測試。8.1 場景搭建將BP_CombatPlayer拖入場景。放置幾個BP_SimpleEnemy在玩家周圍。確保玩家的AttackCollisionBox在視口中可見在細節面板勾選“在游戲中隱藏”為否測試后可關閉以便觀察其激活范圍。8.2 功能測試流程啟動游戲點擊運行。控制角色移動至敵人附近。測試基礎攻擊按下攻擊鍵如鼠標左鍵。觀察角色是否播放第一段攻擊動畫。在動畫的特定幀AttackCollisionBox是否可視化地出現如果設置為可見。當碰撞盒與敵人重疊時敵人是否播放受擊動畫、血量是否減少、傷害數字是否彈出。屏幕是否有輕微震動。測試連擊在第一次攻擊動畫的收招階段連擊窗口內再次按下攻擊鍵。觀察角色是否流暢地播放第二段、第三段攻擊動畫。每次攻擊的命中判定是否獨立生效。測試判定失效在攻擊動畫的碰撞盒未激活階段攻擊或攻擊空氣確認不會觸發命中反饋。測試反饋組合命中時確認傷害數字、屏幕震動、受擊音效和特效是否同時觸發營造出足夠的打擊感。8.3 性能觀察在測試時打開“統計(Stat)”窗口快捷鍵~后輸入stat unit或stat fps。幀率(FPS)在連續攻擊和多個敵人同時受擊時幀率應保持穩定。如果驟降檢查粒子特效是否過于復雜或每幀內執行的邏輯如大量重疊事件處理是否過重。Draw Calls傷害數字UI如果大量生成且未做池化管理可能會增加繪制調用。對于原型階段數量不多時可接受。9. 常見問題與排查方法在實現過程中你可能會遇到以下典型問題問題現象可能原因排查方式解決方案按下攻擊鍵無任何反應1. 輸入未正確綁定。2.bCanAttack初始為False或未重置。3. 動畫蒙太奇引用為空。1. 檢查項目設置中的輸入綁定。2. 在角色藍圖中打印bCanAttack的值。3. 檢查AttackMontage變量是否已賦值。1. 重新綁定輸入。2. 確保在動畫播放完成/中斷事件中重置bCanAttack。3. 在角色藍圖的細節面板或事件開始運行時為變量賦值。攻擊動畫播放但無法命中敵人1. 碰撞盒未正確附著或大小/位置不對。2. 碰撞盒的碰撞預設未正確設置或與敵人的碰撞通道無交互。3. 動畫通知未觸發或觸發后未啟用碰撞事件。1. 在編輯器中運行游戲并顯示碰撞盒\鍵觀察其位置。2. 檢查AttackCollisionBox和敵人HitCollisionBox的碰撞預設和響應。3. 在EnableHitBox通知和角色函數中添加打印字符串確認邏輯被執行。1. 調整碰撞盒的附著骨骼和變換。2. 確保攻擊盒與受擊盒的碰撞通道能產生重疊事件如都設置為OverlapAllDynamic。3. 調試動畫通知的執行流程。單次攻擊對同一敵人造成多次傷害“已命中列表”未生效或清空時機不對。碰撞盒在單次激活期間與敵人持續重疊觸發多次BeginOverlap。在重疊事件中打印調試信息查看每次命中時敵人是否已在列表中。檢查DisableHitBox通知是否被調用并清空列表。確保在BeginOverlap事件中先檢查列表。確保在攻擊結束時DisableHitBox或每次攻擊開始時清空舊列表。傷害數字顯示位置錯誤世界坐標到屏幕坐標的轉換錯誤??丶^點設置問題。打印Project World Location to Screen節點輸出的屏幕坐標值。檢查傷害數字控件的對齊和錨點。確保傳入的世界坐標是命中點的坐標。將控件的對齊方式設置為0.5, 0.5錨點設置為中心。連擊無法銜接總是從第一段開始ComboCount在每次攻擊后都被錯誤重置。連擊窗口期太短輸入未被檢測到。打印每次攻擊前后的ComboCount值。檢查重置ComboCount的邏輯如在狀態機回Idle時。確保只有在連擊超時或受擊時才重置ComboCount。可以延長基于定時器的連擊窗口期。屏幕震動效果不明顯或沒有1. 相機震動資產未創建或強度太低。2.PlayCameraShake調用的對象不對應在玩家控制器上調用。3. 震動在短時間內被多次調用覆蓋。1. 檢查相機震動資產的參數。2. 確認調用PlayCameraShake節點的Target是玩家控制器。3. 添加調試信息確認函數被調用。1. 調整震動資產的Oscillation Duration和Rotational/Oscillation Amplitude。2. 使用Get Player Controller節點獲取控制器。10. 優化與擴展方向當基礎系統運行穩定后可以考慮以下優化和擴展使其更健壯、更專業。10.1 系統優化對象池管理頻繁生成的傷害數字、命中特效應使用對象池進行復用避免頻繁的創建和垃圾回收開銷。事件分發器解耦將“命中事件”、“受傷事件”使用事件分發器Event Dispatcher進行廣播。這樣UI、音效、相機震動等系統只需監聽這些事件而不需要直接引用玩家或敵人藍圖降低耦合度。數據驅動將攻擊力、連擊節奏、碰撞盒參數、傷害反饋強度等配置到數據表Data Table或結構體Struct中便于策劃調整和平衡。10.2 功能擴展技能系統在連擊基礎上引入魔力值Mana或技能冷卻實現重擊、跳躍攻擊、范圍技能等。每種技能可以配置獨立的動畫蒙太奇、碰撞體和傷害計算。防御與格擋為敵人添加攻擊行為為玩家添加格擋、閃避機制。這需要新的輸入綁定、動畫狀態和判定邏輯如格擋成功時減傷、觸發彈反。鎖定系統實現目標鎖定功能使攻擊和鏡頭自動朝向鎖定的敵人。更復雜的AI為敵人賦予巡邏、追擊、攻擊決策等行為樹邏輯。存檔與屬性成長集成游戲實例Game Instance或存檔系統管理玩家的永久屬性如力量、敏捷影響基礎傷害。10.3 網絡同步基礎思路如需若要改為多人游戲核心改動點角色移動與動畫使用UE內置的Character Movement Component進行網絡同步。攻擊與命中判定必須在服務器端進行權威判定。客戶端發起攻擊請求服務器執行碰撞檢測、計算傷害然后廣播結果給所有客戶端。RPC調用使用ServerRPC 讓服務器執行關鍵邏輯如Server_Attack使用MulticastRPC 讓所有客戶端播放非權威性的視覺效果如受擊動畫、特效。預測與調和對于高頻操作如移動可能需要客戶端預測和服務器調和但這會大幅增加復雜度。對于原型可以先采用完全的服務器權威模式。這套基于UE5.7的戰斗系統實戰框架已經涵蓋了從輸入到渲染反饋的完整鏈條。它的價值在于模塊清晰、邏輯直接你可以快速看到每一拳、每一刀背后的運行機制。建議你先嚴格按照步驟實現基礎版本確保連擊、命中、反饋三個核心環節都能跑通。之后再選擇最感興趣的一兩個擴展方向進行深化比如先做一個酷炫的技能特效或者為敵人添加簡單的巡邏AI。動手修改和調試的過程才是理解UE5游戲邏輯最有效的途徑。