这次我们来看一个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. 内容准备动画资源你需要一套基础的攻击动画。可以在虚幻商城搜索免费资源如“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游戏逻辑最有效的途径。