ARTICLE DETAIL

资讯详情

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

UE5近战平A攻击蓝图实战:BP_SystemAttack组件详解(上篇)

UE5近战平A攻击蓝图实战:BP_SystemAttack组件详解(上篇) 在 UE5 的战斗系统开发里近战平A经常是新手接触攻击蓝图时遇到的第一个完整逻辑闭环。玩家按一下攻击键角色播放攻击动画系统在合适的帧产生判定命中后执行伤害反馈最后状态复位等待下一次输入。这一串流程如果全部堆在角色蓝图中前期看似能跑通后期一旦加入连击、蓄力、技能取消后摇、敌人AI共享逻辑事件图表会迅速失控。下面这篇笔记围绕一个独立的攻击蓝图BP_SystemAttack展开重点整理近战普通攻击的逻辑编写上篇攻击状态如何流转、输入如何进入组件、动画如何驱动逻辑、运行后如何验证和排错。攻击判定、伤害结算、Niagara 命中特效会放在后续部分单独讨论本文先把攻击逻辑的骨架搭稳。内容适合已经掌握 UE5 基本操作、创建过第三人称项目、准备开始做战斗系统的开发者。读完以后能够在自己的角色项目中复现一套可扩展的近战平A攻击蓝图并建立一条从“按键输入”到“状态复位”的完整排查链路。1. 近战平A看起来简单为什么值得单独写一套攻击蓝图1.1 近战平A的最小逻辑闭环从玩家视角看近战平A就是按一次攻击键角色挥一下武器。但从蓝图逻辑层看它至少由五个阶段组成输入检测玩家按下攻击键Enhanced Input 触发对应事件。状态判断角色当前是否处于攻击中、是否在冷却、是否允许发起新的攻击。动画播放根据当前连击段数播放对应的 AnimMontage表现前摇、出手、后摇。攻击判定在动画的某一帧生成攻击盒或射线检测命中的敌人。状态复位动画播放完毕清理攻击标记冷却结束角色回到待机状态。新手最常见的问题是把“播放一段攻击动画”当成整个攻击逻辑。只要攻击不是瞬发状态判断、阶段划分、连击窗口、冷却管理都必须单独设计否则任何一个环节的时序错误都会体现为“角色动画播放了但攻击没生效”或“攻击按了没反应”。1.2 BP_SystemAttack 为什么独立成蓝图而不是写在角色里攻击逻辑放在角色蓝图里短时间内最方便因为角色蓝图里已经有 Mesh、AnimInstance、输入事件等引用。问题在于角色蓝图本身还要承担移动、跳跃、相机、交互甚至背包逻辑。攻击逻辑的变量和节点一旦增多角色蓝图会变成一张难以维护的大图。抽成独立的BP_SystemAttack攻击蓝图核心收益有几个方面攻击逻辑只维护攻击状态机和输入响应不关心移动和相机。同一套攻击系统可以复用到玩家角色、敌人 AI、NPC不需要复制粘贴节点。调试时可以在组件蓝图中单步追踪bIsAttacking、bCanAttack、AttackComboIndex等变量的变化。后续加入新武器、新角色时只需要替换蒙太奇数组和调整参数不需要重写逻辑。在课程实践中BP_SystemAttack最常见的实现形式是 Actor Component。一个攻击系统组件挂到角色 Blueprint 上角色只负责把输入事件转发给组件组件内部完成状态判断和动画驱动。下面按这个方案展开。1.3 本文覆盖范围和后续边界从标题可以看出这是近战平A攻击蓝图逻辑编写的“上篇”意味着这一阶段聚焦逻辑框架不在判定和伤害上深入。这一阶段覆盖的内容包括BP_SystemAttack的框架结构、核心变量、对外接口。输入从角色蓝图到攻击组件的转发链路。单段平A和基础多段连击的状态流转。用 AnimMontage 和 AnimNotify 精确驱动攻击阶段。运行验证、日志输出、常见问题排查。这一阶段不展开的内容包括攻击判定盒的具体形状、碰撞通道、伤害公式。命中后的飘字、受击动画、击退、顿帧。Niagara 特效资产制作和命中特效生成。GameplayAbilitySystem 等更复杂的战斗框架接入。边界清楚以后读者的预期就不会错位先看懂逻辑骨架再进入判定和表现层。2. 先把项目和角色基础准备到位2.1 版本选择和项目创建本文示例使用 UE5.0 以上的第三人称模板在 UE5.3、UE5.4 的默认第三人称项目上操作基本一致。如果你用的是 UE5.1、UE5.2差异不大。项目创建建议选择 Games 分类下的 Third Person 模板项目类型选蓝图或 C 都可以本文以蓝图为主不依赖 C 代码。模板自带的第三人称角色包含胶囊体、网格体、CharacterMovementComponent 和弹簧臂相机足够支撑攻击逻辑开发。打开项目后先确认 Enhanced Input 插件是否启用。在 UE5 的第三人称模板中增强输入默认启用。如果项目是从旧版升级而来需要在 Edit - Plugins 中搜索 Enhanced Input确保插件开启并在 Project Settings - Engine - Input 中把 Default Classes 的 Input System 设置为 Enhanced Input。否则后面创建的 Input Action 可能无法被角色正确响应。2.2 组件挂载和目录规划在 Content 中建议先建立清晰的目录结构避免资产越来越多之后找不到Content/ Combat/ Attack/ # 攻击蓝图和攻击相关资产 Animations/ # 攻击动画和蒙太奇 Input/ # Input Action 和 Input Mapping Context FX/ Niagara/ # 后续命中特效和拖尾特效 UI/ # 血条、飘字等在这个目录下创建一个攻击系统组件在 Content/Combat/Attack 目录右键选择 Blueprint Class。父类选择 Actor Component。命名为BP_SystemAttack。打开角色蓝图在组件面板中添加 BP_SystemAttack最终组件层级大致如下BP_ThirdPersonCharacter CameraBoom FollowCamera CharacterMesh BP_SystemAttack # 攻击系统组件组件挂载后角色的蓝图系统会自动获取这个组件引用。BP_SystemAttack内部通过 Get Owner 获取角色再通过 Cast 到 Character 或直接获取 Mesh不需要在组件里手填空引用。注意如果项目中有多种角色类型建议在组件内只 Cast 到 Character 父类不要 Cast 到具体某个角色蓝图类。这样玩家角色和敌人能挂载同一个攻击组件复用性更强。2.3 增强输入配置Input Action 和 Mapping Context近战平A需要一个输入动作资产。在 Content/Combat/Input 目录下右键选择 Input - Input Action命名为IA_Attack。在 IA_Attack 的细节面板中Value Type 选择 Digital (bool)。Triggers 中添加 Pressed 触发器或者保持默认的 Down 行为具体看项目手感要求。不需要设置为 Repeated避免按着键时重复触发攻击。接着创建 Input Mapping Context命名为IMC_Combat。打开 IMC_Combat在 Mappings 数组中添加一条映射Input Action 选择 IA_Attack。键盘键位建议用 J、F 或鼠标左键开发期选一个不会被移动跳跃冲突的按键。可以添加修饰器和触发器这个阶段用默认配置即可。角色启动时需要加载这个映射上下文。在角色蓝图的 BeginPlay 事件中使用 Add Mapping Context 节点设置 Mapping Context 为 IMC_Combat。Priority 设为 1。这一步很容易被忽略。很多“攻击按了没反应”的问题根源不是攻击蓝图写错而是当前 Pawn 根本没有加载输入映射上下文。所以先验证输入事件是否触发再怀疑状态机。3. BP_SystemAttack 的核心变量和对外接口3.1 攻击状态用哪些变量表示打开 BP_SystemAttack在 Variables 中创建以下变量。这些是攻击状态机的核心状态位。变量名类型默认值说明bIsAttackingBooleanfalse当前是否处于攻击动画播放中bCanAttackBooleantrue是否允许发起一次新的攻击受冷却控制bInComboWindowBooleanfalse当前是否处于允许输入连击的窗口bComboPendingBooleanfalse是否缓存了一次连击输入AttackComboIndexInteger0当前连击段索引从 0 开始AttackMontagesArrayAnimMontage空每段平A对应的蒙太奇按顺序存放MaxComboCountInteger2最大连击段数AttackCooldownTimeFloat0.3攻击结束后到下一次攻击的冷却时间OwnerMeshSkeletalMeshComponent空角色网格体引用BeginPlay 中自动获取为什么需要bIsAttacking和bCanAttack两个布尔变量而不是一个状态变量因为“正在攻击”和“可以开始下一次攻击”不是同一时间段。角色后摇动画还没有播完时bIsAttacking已经可以变为 false但距离下一次攻击还需要一小段冷却。如果只用一个变量攻击结束的瞬间玩家就可以再次按键手感会变得松散或者反过来动画播放期间一直无法响应下一段输入。bInComboWindow和bComboPending是连击输入的核心。它们表示玩家是否在窗口期内按了下一个攻击键以及当前段攻击结束后是否应自动接上下一段。3.2 对外暴露哪些参数BP_SystemAttack 细节面板应该把常用参数暴露出来方便在编辑器中配置。在变量的细节面板中勾选 Instance Editable。Category 设置为 Combat/Attack 或 Axe 等分类。把 AttackMontages、MaxComboCount、AttackCooldownTime 放为主配置参数。调试参数如 bDrawDebugSpheres、bDebugLogEnabled 单独放到 Debug 分组。这样每个角色在蓝图实例上就能配置自己的攻击段数、蒙太奇资源和冷却时间不需要修改组件逻辑。例如玩家角色可以配 3 段平A小怪可以只配 1 段普通攻击攻击冷却不同手感自然不同。3.3 对外接口如何设计BP_SystemAttack 需要给角色蓝图或 AI 提供明确的调用入口。外部组件不应该直接修改组件内部的攻击状态变量而应该调用接口由组件内部决定状态如何变化。这一阶段建议提供这几个接口Attack / TryAttack发起一次攻击尝试。由角色输入事件调用。SetComboWindowEnabled由动画通知调用用于打开或关闭连击窗口。OnHitCheckNotify由动画通知调用表示当前到达命中判定帧。ResetAttackState由受击、闪避、死亡等打断逻辑调用强制复位攻击状态。接口设计原则是角色蓝图只负责把“玩家的攻击意图”和“动画通知事件”转发进来组件内部负责状态判断、蒙太奇播放、定时器管理。如果角色蓝图直接去置位bIsAttacking会破坏组件的状态一致性后续排错时很难判断到底是哪一层把状态改错了。4. 攻击状态机的完整流转逻辑4.1 从按下按键到攻击开始整个攻击状态的入口是玩家按下攻击键。链路如下Enhanced Input 节点IA_Attack触发 Triggered 事件。节点Get Component by Class获取角色身上的 BP_SystemAttack 组件。调用组件的 Attack 接口。在 BP_SystemAttack 内部Attack 事件需要完成状态判断再启动动画。用 C 伪代码表达等价逻辑会非常清晰void UBP_SystemAttack::TryAttack() { if (bIsAttacking) { // 正在攻击中走连击输入缓存逻辑 if (bInComboWindow AttackComboIndex MaxComboCount - 1) { bComboPending true; } return; } if (!bCanAttack) return; StartAttack(0); } void UBP_SystemAttack::StartAttack(int32 ComboIndex) { bIsAttacking true; bCanAttack false; AttackComboIndex ComboIndex; bComboPending false; if (AttackMontages.IsValidIndex(ComboIndex)) { UAnimInstance* AnimInstance OwnerMesh-GetAnimInstance(); AnimInstance-Montage_Play(AttackMontages[ComboIndex]); } }在蓝图中Attack 事件对应的节点连线大致是Attack - Branch (IsValid OwnerMesh) - Branch (NOT bIsAttacking) - Branch (bCanAttack) - Set bIsAttacking true - Set bCanAttack false - Set AttackComboIndex 0 - Get Anim Instance - Montage_Play(AttackMontages[AttackComboIndex])这一步完成后角色开始播放攻击动画。但攻击逻辑并没有结束蒙太奇播放过程中会通过动画通知把命中帧、连击窗口、动画结束等时间点反馈给组件。4.2 连击逻辑和输入窗口判断多段平A最容易出错的地方在于“什么时候允许连击”。如果玩家按下第一次攻击的瞬间就允许第二次攻击动画会被硬切表现非常突兀。如果整个攻击动画期间都允许连击玩家乱按三次系统可能跳过了第二段直接播放第三段视觉上像动画 bug。推荐做法是引入连击窗口在蒙太奇中把AnimNotify_ComboWindowStart放在命中判定之后。把AnimNotify_ComboWindowEnd放在后摇结束前。玩家在这段时间内再次按下攻击键系统记录 b
返回列表