十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

UE5近战攻击系统:从输入映射到动画蒙太奇的完整实现指南

UE5近战攻击系统:从输入映射到动画蒙太奇的完整实现指南 在 UE5 游戏开发中为角色实现流畅、响应迅速且富有打击感的近战攻击是提升玩家体验的关键一环。很多开发者在处理鼠标点击攻击时常常会遇到动画播放不连贯、输入响应延迟或动画与角色状态不匹配等问题。本文将围绕“鼠标左键点击触发攻击动画”这一核心需求详细拆解从输入映射配置、动画蓝图状态机设计到蒙太奇动画播放的完整闭环流程。无论你是刚接触 UE5 动画系统的新手还是希望优化现有战斗逻辑的开发者都能通过本文获得一套可直接复用于项目的实战方案。1. 近战攻击系统核心概念与设计思路在开始动手之前我们需要明确几个核心概念和整体的设计思路这有助于理解后续每一步操作的“为什么”。近战平A普通攻击在动作游戏中通常指角色通过基础输入如鼠标点击、手柄按键触发的、可连续执行的常规攻击动作。它不同于需要消耗资源或冷却的技能。输入映射Input Mapping虚幻引擎用于将物理设备如键盘、鼠标、手柄的输入事件如按下、松开映射到游戏内逻辑事件如“Jump”、“Attack”的配置系统。它是玩家操作与游戏逻辑之间的桥梁。动画蒙太奇Animation Montage可以将多个动画序列Animation Sequence组合成一个可动态播放的复杂动画的工具。对于攻击动作蒙太奇不仅能播放挥砍动画还能在特定帧通知帧触发伤害判定、音效、粒子效果等事件是实现打击感的核心组件。动画蓝图Animation Blueprint一种基于蓝图的可视化编程工具专门用于控制角色的骨骼网格体Skeletal Mesh如何播放动画。它包含事件图Event Graph用于逻辑判断和动画图表Anim Graph用于混合、输出最终的姿势。设计流程总览配置输入在项目设置中将鼠标左键点击映射为一个名为“PrimaryAttack”的输入动作。响应输入在角色的蓝图如BP_PlayerCharacter中监听“PrimaryAttack”输入事件。触发逻辑当输入触发时执行攻击逻辑例如检查是否可攻击、消耗体力等并最终调用播放蒙太奇的函数。播放动画在动画蓝图中根据角色是否正在播放攻击蒙太奇来驱动状态机切换从而让骨骼网格体播放对应的攻击动画。增强反馈在攻击蒙太奇中插入通知Notifies在准确的时刻触发伤害检测、屏幕抖动、音效等形成完整的打击链。2. 环境准备与项目设置在开始实操前请确保你的开发环境已就绪。本文示例基于最常见的 UE5 版本环境但核心逻辑适用于 UE4.26 及 UE5 的大部分版本。所需环境与版本引擎版本Unreal Engine 5.0 或更高版本本文演示基于 UE5.2。项目模板建议使用第三人称游戏Third Person模板创建项目它已包含一个可控制角色Character及其动画蓝图是绝佳的起点。操作系统Windows 10/11 或 macOS。额外资源你需要一个攻击动作的动画序列.fbx或引擎内的动画资源。可以从虚幻商城获取免费资源包如“Infinity Blade: Warriors”或使用自制的动画。创建示例项目打开 Epic Games Launcher切换到“虚幻引擎”标签页。点击“启动”按钮旁边的下拉箭头选择你要使用的 UE5 版本例如 5.2.1。在项目浏览器中点击“游戏”类别选择“第三人称”模板。设置项目名称如MeleeAttackDemo、路径并确保蓝图是所选项目类型。点击“创建”等待项目生成完毕。项目创建后你会在内容浏览器中看到Content/ThirdPerson文件夹里面包含了角色蓝图BP_ThirdPersonCharacter、动画蓝图ABP_ThirdPerson以及相关的动画和模型资源。我们将以此为基础进行改造。3. 配置鼠标左键输入映射第一步是告诉引擎“当玩家按下鼠标左键时我想把它当作‘主攻击’命令。”在编辑器主菜单中点击编辑Edit - 项目设置Project Settings。在项目设置窗口的左侧面板中找到并点击引擎Engine分类下的输入Input。在右侧的“绑定Bindings”区域你会看到“操作映射Action Mappings”和“轴映射Axis Mappings”。攻击通常是一次性动作所以我们使用操作映射Action Mappings。点击“操作映射”旁边的号新增一个映射项。将新映射项命名为PrimaryAttack。这个名称将在蓝图中被引用。点击PrimaryAttack映射下“按键Key”旁边的下拉菜单选择鼠标左键Left Mouse Button。可选你可以点击PrimaryAttack旁边的号为同一个操作添加多个按键绑定例如同时绑定手柄的Right Trigger键。关键配置说明操作映射 vs 轴映射操作映射用于“是/否”的离散输入如跳跃、攻击、交互。轴映射用于连续变化的输入如移动、视角旋转。攻击是瞬发动作适用操作映射。命名规范使用清晰、一致的命名如PrimaryAttack,SecondaryAttack,Dodge便于在大型项目中维护。完成后的输入设置应如下图所示// 项目设置 - 输入 - 操作映射 Action Mappings: - PrimaryAttack Keys: Left Mouse Button注以上为示意实际在编辑器界面中操作无需编写代码。4. 在角色蓝图中响应输入并触发攻击接下来我们需要在玩家控制的角色蓝图中监听我们刚设置的PrimaryAttack输入事件并执行攻击逻辑。在内容浏览器中找到并双击打开ThirdPerson/Blueprints文件夹下的BP_ThirdPersonCharacter。在角色蓝图的事件图表Event Graph中右键点击空白处打开上下文菜单。搜索并添加输入事件Input Events分类下的InputAction PrimaryAttack事件节点。引擎会自动识别你在项目设置中定义的PrimaryAttack操作。默认会有两个输出引脚Pressed按下时触发和Released松开时触发。对于近战攻击我们通常关心按下瞬间所以连接Pressed引脚。现在当鼠标左键按下时我们需要播放攻击动画。播放动画蒙太奇的功能通常由角色Character或骨骼网格体组件Skeletal Mesh Component提供。我们从角色自身出发。从InputAction PrimaryAttack事件的Pressed引脚拉出引线搜索并添加Play Montage节点。Target需要指定在哪个骨骼网格体上播放蒙太奇。将Play Montage节点的Target引脚连接到Get Mesh节点的返回值上BP_ThirdPersonCharacter的骨骼网格体组件。Montage to Play这是关键参数需要传入一个动画蒙太奇Animation Montage资产。我们现在还没有创建可以先留空或创建一个变量引用。为了演示我们假设稍后会创建一个名为AM_PrimaryAttack的蒙太奇。可选但重要添加攻击状态检查直接连接会导致玩家可以无限连点打断动画或产生逻辑错误。通常我们需要一个布尔变量如bIsAttacking来控制。在“我的蓝图My Blueprint”面板中创建一个布尔型变量命名为bIsAttacking默认值为False。在Play Montage节点前添加一个分支Branch节点。条件判断应为“是否不在攻击中”即NOT bIsAttacking。当条件为真可以攻击时才执行Play Montage并立即将bIsAttacking设置为True。我们需要在蒙太奇播放结束或被中断时将bIsAttacking重置为False。这可以通过Play Montage节点输出的On Completed和On Interrupted引脚来实现。一个简化的、包含状态检查的蓝图逻辑示例如下// 事件InputAction PrimaryAttack (Pressed) // 此段为蓝图节点逻辑的文字描述实际在蓝图编辑器中连接节点 1. [InputAction PrimaryAttack] (Pressed) - [Branch] Condition 2. 获取变量 [bIsAttacking] - [NOT] - 连接到 [Branch] 的 Condition 引脚 3. [Branch] (True) 输出引脚执行流 a. [Set bIsAttacking] (Value True) b. [Get Mesh] - [Play Montage] 的 Target 引脚 c. 设置 [Play Montage] 的 Montage to Play 为你的攻击蒙太奇资产例如 AM_PrimaryAttack d. 从 [Play Montage] 的 On Completed 引脚 - [Set bIsAttacking] (Value False) e. 从 [Play Montage] 的 On Interrupted 引脚 - [Set bIsAttacking] (Value False) 4. [Branch] (False) 输出引脚可以连接一个播放“攻击冷却”音效或UI提示的节点或者什么都不做。5. 创建与配置攻击动画蒙太奇动画蒙太奇是攻击动作的载体。我们创建一个蒙太奇并将攻击动画序列放入其中。在内容浏览器中右键点击选择动画Animation - 蒙太奇Montage。命名为AM_PrimaryAttack。双击打开AM_PrimaryAttack。在蒙太奇编辑器的资产详情Asset Details面板中确保目标骨架Target Skeleton是你的角色骨架例如SK_Mannequin。在下方的时间轴区域右键点击轨道选择添加插槽Add Slot。可以命名为DefaultSlot或AttackSlot。插槽用于动画蓝图中的状态机引用。从内容浏览器中将你的攻击动画序列例如ThirdPerson/Animations文件夹下的某个攻击动画拖拽到蒙太奇时间轴的插槽轨道上。它会自动创建一个片段Section。核心步骤添加通知Notifies在动画片段上方的轨道栏中你可以添加各种通知这是实现打击感的关键。伤害通知在武器挥砍到命中点的帧上右键点击通知轨道选择添加通知Add Notify - 新建通知...New Notify...。命名为Notify_Hit。你需要后续在角色蓝图中创建并绑定一个自定义事件来处理这个通知以触发伤害检测如球形检测、盒体检测。音效通知在合适的位置添加PlaySound通知选择武器挥动或命中的音效。粒子效果通知添加Spawn Emitter Attached通知选择命中时产生的火花、刀光等粒子系统。调整蒙太奇的混合选项Blend Options特别是混合出时间Blend Out使攻击动画能平滑地过渡回待机或移动状态。6. 在动画蓝图中驱动攻击状态现在角色蓝图能播放蒙太奇了但角色的骨骼网格体如何知道该播放这个蒙太奇呢这需要通过动画蓝图来驱动。打开ThirdPerson/Blueprints文件夹下的动画蓝图ABP_ThirdPerson。切换到动画图表Anim Graph。你会看到一个由State Machine节点最终输出到Final Animation Pose的图表。双击State Machine节点进入状态机编辑。默认可能有Idle/Walk/Run、JumpStart、JumpLoop、JumpEnd等状态。我们需要添加一个攻击状态。在状态机图表中右键选择添加状态Add State命名为Attack。将默认的入口箭头Entry连接到Attack状态或者从其他状态如Locomotion通过转换规则Transition Rules连接到Attack状态。更常见的做法是使用插槽Slot。回到ABP_ThirdPerson的事件图表Event Graph。我们需要一个变量来接收角色蓝图传来的“是否正在播放攻击蒙太奇”的信息。在角色蓝图中播放蒙太奇时可以顺带设置一个布尔变量如bPlayAttackMontage并通过Blueprint Owner传递给动画蓝图。但更标准的方式是使用尝试获取蒙太奇信息Try Get Montage Info节点。在事件图表中添加一个Try Get Montage Info节点Target连接到Try Get Pawn Owner返回的Mesh组件。将Montage to Check留空或设置为你的攻击蒙太奇AM_PrimaryAttack。Out Is Playing引脚会输出一个布尔值表示该蒙太奇是否正在播放。将这个Out Is Playing布尔值提升为动画蓝图的一个变量例如bIsPlayingAttackMontage。回到状态机设置从Locomotion状态到Attack状态的转换规则条件就是bIsPlayingAttackMontage True。从Attack状态转出的规则则是bIsPlayingAttackMontage False。在Attack状态内部放置一个Slot节点命名为DefaultSlot与蒙太奇中的插槽名对应然后连接一个DefaultSlot节点来自蒙太奇的输出。这样当角色播放AM_PrimaryAttack蒙太奇时动画蓝图的状态机会切换到Attack状态并播放插槽中的蒙太奇动画。动画蓝图状态机简化流程事件图表每帧更新 Try Get Pawn Owner - Get Mesh - Try Get Montage Info (AM_PrimaryAttack) - (Out Is Playing) - 设置变量 bIsPlayingAttackMontage 状态机转换规则 Locomotion - Attack: bIsPlayingAttackMontage True Attack - Locomotion: bIsPlayingAttackMontage False Attack 状态内部 [状态入口] - [Slot ‘DefaultSlot’] - [输出姿势]7. 实现伤害检测与打击反馈攻击动画播放了但还没有实际伤害。我们需要在蒙太奇通知触发的时刻进行伤害检测。创建自定义通知类可选但推荐对于复杂的攻击逻辑建议创建C或蓝图通知类。这里以蓝图通知为例。在内容浏览器中右键选择动画Animation - 蓝图动画通知Blueprint Animation Notify命名为AnimNotify_AttackHit。打开该蓝图在其事件图表中可以添加Receive Notify事件。当蒙太奇播放到该通知点时会触发此事件。在此事件中可以调用角色身上的自定义函数如ApplyAttackDamage来执行伤害检测。在角色蓝图中实现伤害检测函数在BP_ThirdPersonCharacter中创建一个新的函数命名为ApplyMeleeDamage。在函数内部使用球形检测Sphere Trace或盒体检测Box Trace节点。起点Start可以设为角色的骨骼插座Socket例如右手武器骨骼hand_r终点End可以设为起点向前一定距离。半径Radius根据武器大小设定。检测通道Trace Channel设置为Visibility或自定义的Pawn通道以检测敌人。检测结果会返回一个命中结果数组。遍历这个数组对每一个命中的 Actor判断其是否属于敌人类例如检查 Tag 或 Cast To 到 Enemy Class然后对其应用伤害使用Apply Damage节点。绑定通知回到攻击蒙太奇AM_PrimaryAttack在之前添加Notify_Hit的位置现在可以选择我们创建的AnimNotify_AttackHit蓝图通知类。确保AnimNotify_AttackHit通知的Notify Target是角色自身。增强反馈在伤害检测的同时或之后可以触发更多反馈摄像机抖动使用Player Camera Manager的PlayCameraShake节点。命中停顿Hit Pause通过设置全局时间膨胀Set Global Time Dilation为一个极小值如0.01并短暂延迟后恢复可以制造经典的“打击停顿”效果。命中特效与音效在伤害检测命中的位置生成粒子效果并播放命中音效。8. 常见问题与排查思路在实现过程中你可能会遇到以下问题。这里提供排查思路问题现象可能原因排查步骤与解决方案点击鼠标左键无任何反应1. 输入映射未正确配置或命名错误。2. 角色蓝图中未绑定InputAction PrimaryAttack事件。3. 角色蓝图未被玩家控制。1. 检查项目设置中的输入映射名称是否与蓝图事件中搜索的名称完全一致区分大小写。2. 确保InputAction PrimaryAttack事件已正确添加到角色蓝图的事件图表并连接到执行逻辑。3. 在游戏模式GameMode中检查默认Pawn类是否设置为你的角色蓝图。攻击动画播放一次后无法再次播放1.bIsAttacking布尔变量未被正确重置为False。2. 蒙太奇的On Completed或On Interrupted事件未正确连接。3. 动画蓝图状态机转换规则卡死。1. 检查Play Montage节点的On Completed和On Interrupted引脚是否都连接到了重置bIsAttacking为False的节点。2. 在动画蓝图中打印或调试bIsPlayingAttackMontage变量的值确认其在动画结束后是否变为False。3. 检查蒙太奇资产本身的长度和混合时间设置是否合理。攻击动画播放但角色位置滑动/漂移1. 攻击动画序列本身包含根骨骼运动Root Motion。2. 动画蓝图未正确处理根骨骼运动。1. 在攻击动画序列的资产详情中检查启用根骨骼运动Enable Root Motion是否被勾选。如果不需要动画驱动移动可以取消勾选。2. 在角色移动组件中确保根骨骼运动Root Motion相关的设置如Has Root Motion与你的需求匹配。对于第三人称模板可能需要手动处理根骨骼运动带来的位移。伤害检测时机不准或检测不到敌人1. 蒙太奇中的通知点位置不准确。2. 球形/盒体检测的参数位置、大小、通道设置错误。3. 伤害检测函数未被通知正确调用。1. 在蒙太奇编辑器中仔细拖动时间轴将通知点精确放置在武器与目标接触的帧上。可以慢速播放预览。2. 在角色蓝图中使用Draw Debug Sphere/Box节点可视化你的检测范围确保它能覆盖到敌人。3. 在ApplyMeleeDamage函数开始处添加Print String节点确认函数是否被调用。检查通知类是否被正确赋值给蒙太奇的通知轨道。攻击动画与移动动画混合不自然1. 蒙太奇的混合时间Blend In/Out Time设置不当。2. 动画蓝图状态机转换的混合时间设置不当。1. 调整蒙太奇资产的混合选项特别是Blend Out时间使其能平滑过渡。2. 在动画蓝图状态机的转换规则线上双击可以设置转换的混合时间Crossfade Duration适当增加时间可以使切换更平滑。9. 最佳实践与工程化建议将基础功能跑通后以下建议可以帮助你构建更健壮、易扩展的近战系统数据驱动设计不要将攻击伤害、检测范围、冷却时间等硬编码在蓝图里。创建一个数据资产Data Asset或结构体Struct例如FAttackComboData里面定义一次连击段中每一击的蒙太奇、伤害、硬直、检测范围等参数。角色蓝图中引用这个数据资产使数值调整与逻辑分离。连击系统维护一个ComboIndex整数变量记录当前是第几段攻击。在PrimaryAttack输入事件中根据ComboIndex播放对应的蒙太奇段Montage Section。在蒙太奇的特定窗口期通过通知或动画状态机监听下一次攻击输入如果成功输入则递增ComboIndex并播放下一段动画同时重置窗口期计时器。动画通知状态Anim Notify State对于需要持续一段时间的逻辑如攻击检测窗口、无敌帧使用动画通知状态Blueprint Animation Notify State而非单点通知。它包含Notify Begin、Notify Tick、Notify End三个事件非常适合处理时间段。分层动画蓝图Layered Anim Blueprint将上半身攻击动画和下半身移动动画分离。使用分层动画蓝图或动画蓝图中的分层混合节点。这样可以在移动中攻击攻击中转向使动作更丰富自然。网络同步对于多人游戏如果项目是多人游戏所有输入处理、蒙太奇播放和伤害检测都必须在服务器端进行权威验证。在角色蓝图中将InputAction事件触发后的关键逻辑如Play Montage和ApplyDamage放在一个运行在服务器Run on Server的RPC远程过程调用函数中。使用Play Montage节点的Net Multicast版本如Multicast Play Montage来让所有客户端同步播放攻击动画。性能与调试避免在每帧的 Tick 事件中进行复杂的射线检测。将检测逻辑放在通知触发的离散事件中。大量使用Print String和Draw Debug节点进行可视化调试但在最终发布版本前记得移除或禁用它们。合理使用蓝图接口Blueprint Interface来定义攻击者与被攻击者之间的交互契约降低蓝图间的耦合度。从配置一个简单的鼠标左键输入映射到在角色蓝图中响应并播放动画蒙太奇再到通过动画蓝图状态机驱动动画切换最后实现带有伤害检测和反馈的完整攻击逻辑我们完成了一套标准的 UE5 近战攻击基础框架。这套流程的核心在于理解输入事件、动画蒙太奇、动画蓝图状态机以及蓝图通知之间的协作关系。掌握这些基础后你可以进一步探索更复杂的内容如武器插槽与附着系统、不同武器类型的攻击动画切换、受击反应与状态机、基于距离的自动索敌与转向等。记住在迭代功能时始终遵循数据驱动和模块化的原则这将使你的战斗系统更易于维护、平衡和扩展。
返回列表