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