资讯动态

【虚幻引擎】项目 简易动作游戏案例演示

发布时间:2026/10/15 4:04:10 来源:尧图企业网站定制
简易动作游戏案例演示这是一个基于 Unreal Engine 蓝图开发的第三人称动作战斗原型 Demo核心循环为输入 → 移动/动画 → 连招/攻击 → 伤害判定 → AI 反馈 → UI 更新。以下从架构总览、六大子系统原理、数据流复盘与优化建议四个维度进行完整拆解。一、整体架构总览子系统核心蓝图/资源职责边界玩家控制PlayerController、PlayerChar接收输入轴/操作事件解耦后转发给角色处理业务动画系统Player/Enemy 动画蓝图、IdleRun_BS、动画通知通过 BlendSpace 驱动移动姿态通过 AnimNotify 驱动战斗节奏连招系统PlayerCharAttackSave/DoAttack/ComboReset管理连击段数、攻击窗口期输入缓存与状态机重置战斗判定PlayerChar、AiChar基于 MultiSphereTrace 进行前方扇形/条形区域检测调用 ApplyDamageAI 行为树AIController、AiCharBehaviorTree、黑板、自定义 Task黑板存储目标Selector 实现巡逻/追击状态切换UI 显示PlayerChar创建控件、EnemyWidget Component运行时创建/绑定 HPBar实现血条跟随二、分模块原理与实现逻辑1. 玩家控制系统三层解耦的输入响应模型项目的输入处理遵循Controller 接收原始输入 → 类型转换为 PlayerChar → 调用自定义事件的分层思路避免在 Controller 中堆积业务逻辑。移动与镜头MoveForward/MoveRight输入轴在 Controller 中通过Cast to PlayerChar后调用角色内的Move Forward/Move Right自定义事件镜头LookUp/LookRight直接调用Add Pitch/Yaw Input保持 Controller 的相机控制权。减速WalkSlowly在 Controller 中捕获按键的Pressed与Released分别调用角色端的Walk Slowly(True/False)。角色端通过分支Walk Status直接修改最大行走速度97.0 减速 / 375.0 正常实现即时无级调速。攻击输入DoAttack操作映射触发后调用角色端的Do Attack事件进入连招系统。输入方向缓存角色 Tick 中持续调用Calcul Last Input将玩家的最后输入向量换算为Last Input Rotation用于攻击时的朝向计算。2. 动画系统BlendSpace 动画通知驱动战斗节奏移动姿态混合动画蓝图中通过Event Blueprint Update Animation获取 Pawn Owner计算速度向量长度并写入Speed变量。IdleRun_BSBlendSpace 以Speed为横轴平滑混合 Idle 与 Run 动画。攻击时转向项目中定义了名为PlayerRotation的 AnimNotify在攻击动画的活跃窗口内通过Received Notify Tick持续调用Set Rotation by AnimIs Interp True将角色朝向平滑插值到Last Input Rotation动画结束时通过Received Notify End关闭插值Is Interp False。这让攻击动作既保持动画本身的前冲感又能响应玩家的微操转向。状态机AnimGraph 中通过IdleRun状态直接承载移动循环攻击则通过动画蒙太奇Montage在上层播放避免与基础状态机冲突。3. 连招系统窗口期缓存与段数循环连招系统的状态机由三个核心变量控制Attack Count当前段数初始 -1、Is Attack是否正在攻击中、Save Attack是否缓存了攻击输入。逻辑时序如下发起攻击DoAttack事件被触发时若Is Attack False则将Attack Count 1并与AttackMontage数组长度比较。若未越界播放对应索引的 Montage设置Is Attack True。若越界重置Attack Count -1从头播放第一段。输入缓存若在攻击动画播放期间Is Attack True再次按下攻击键则设置Save Attack True将输入暂存。动画通知驱动状态切换AnimNotify_ComboStrat连招窗口开始触发Attack Save清空缓存并准备接收下一次输入。AnimNotify_ComboEnd连招窗口结束触发ComboReset将Attack Count / Is Attack / Save Attack全部重置结束当前连击链。受击打断玩家受伤后在受伤判定逻辑末尾显式调用ComboReset防止受击后动画与连招状态错位。设计意图通过动画通知划定“可输入窗口”在窗口内缓存的输入决定下一段攻击是否接续形成类似格斗游戏的“目押”手感。4. 战斗与伤害判定多球体检测 ApplyDamage项目采用前向多球体检测MultiSphereTrace作为近战判定手段而非碰撞体Collision这能更精确地控制检测时机和范围。玩家伤害判定(DoPlayerHit)以 Actor 位置为起点向前方延伸Actor Forward Vector * 距离作为终点执行半径 200 的多球体检测对象过滤为WorldDynamic。命中后遍历结果通过Break Hit Result确认Blocking Hit将命中的 Actor 转换为AIChar后执行Apply Damage基础伤害 10.0。敌人伤害判定(AI Do Hit)逻辑与玩家对称但检测范围不同向前延伸 100半径 75命中后转换为PlayerChar施加伤害。受伤反馈Event Any Damage接收伤害后先检查IsDead避免重复死亡处理。若Current HP 0清零血量、设置IsDead True、播放死亡 Montage。否则扣除血量、播放受击 Montage、延迟后调用ComboReset恢复行动能力。调试可视化视频中可见大量红绿线条为 SphereTrace 与 NavMesh 的调试绘制。5. AI 行为树黑板-Selector 状态机敌人 AI 采用经典的行为树 黑板架构职责分离清晰AIControllerEvent Begin Play时运行AiCharBehaviorTree。Event Tick中持续检查受控 Pawn 的IsDead一旦死亡立即调用Stop Movement避免尸体继续寻路。黑板BlackboardTargetPlayerObject存储追击目标。DestinationVector存储随机巡逻点。行为树结构根节点下挂Sequence→HavePlayer装饰器检查TargetPlayer是否设置→Selector。左分支TargetPlayer 已设置即发现玩家Sequence→Move To(TargetPlayer)→Attack播放1HM_AerialSwing攻击 Montage→Wait(5.0s)。右分支TargetPlayer 未设置即丢失目标Sequence→WalkRandom每 0.40s–0.60s 在半径 500 的 NavMesh 上随机选点→Move To(Destination)。黑板更新 Task感知玩家Perform Condition Check AI中以 AI 自身为原点执行半径 1000 的多球体检测命中PlayerChar后将黑板Target Actor设为玩家。随机巡逻Receive Tick AI中获取当前位置通过Get Random Reachable Point in Radius半径 500生成巡逻点并写入黑板Target Location。设计意图Selector实现了“能打到玩家就追击否则巡逻”的优先级决策Wait节点在攻击后引入硬直避免 AI 连击过于密集。6. UI 与血条系统玩家血条PlayerChar的Event Begin Play中创建Player HPBarWidget 并Add to Viewport作为屏幕空间 UI。敌人血条AiChar的Event Begin Play中获取挂载在角色上的Widget Component名为HPBar将其转换为AiHPBar类型并将AiCharSelf设为目标实现血条与角色实例的数据绑定。三、核心数据流复盘玩家输入 (Controller) │ ├─► 移动/减速 ───────► PlayerChar ───────► 角色移动组件 ───────► 动画蓝图 (Speed) ───────► IdleRun_BS │ ├─► 攻击输入 ────────► DoAttack ─────────► 连招状态机 ────────► 播放攻击 Montage │ │ │ ▼ │ AnimNotify_ComboStrat ──► Attack Save │ AnimNotify_ComboEnd ────► ComboReset │ │ │ ▼ │ AnimNotify(PlayerRotation) ──► 攻击时转向插值 │ │ │ ▼ │ AnimNotify_AiHit / DoPlayerHit ──► MultiSphereTrace ──► ApplyDamage │ │ ├─► 镜头输入 ────────► Add Pitch/Yaw ◄────────────────────────────────────────────┘ 敌人侧 (AI) │ ├─► AIController ──► Run Behavior Tree │ │ │ ├─► 多球体检测(半径1000) ──► 发现玩家 ──► 黑板.TargetPlayer Player │ │ │ │ │ ▼ │ │ Move To(Player) → Attack → Wait │ │ │ └─► 未发现玩家 ──► WalkRandom ──► Move To(Destination) │ └─► Event Any Damage ──► HP 扣除 / 死亡判定 / 受击动画四、亮点输入-控制-角色三层解耦Controller 只负责“接收输入并转发”PlayerChar 负责“执行业务”动画蓝图负责“表现”符合 UE 的 MVC 思想。动画通知驱动战斗节奏伤害判定、连招状态切换、攻击时转向全部挂在 AnimNotify 上实现“所见即所得”的战斗手感动画师可以直观调整窗口期而无需改代码。BlendSpace 驱动移动用单一Speed参数驱动 Idle/Run 混合简洁且易于后续扩展为 Walk/Run/Sprint 多段混合。行为树的 Selector 优先结构追击与巡逻的优先级天然由 Selector 左到右的顺序决定逻辑清晰避免复杂的嵌套分支。调试驱动开发场景中大量可视化调试线Trace、NavMesh、碰撞体是开发过程中注重即时验证。五、总结该 Demo 完整覆盖了从输入、动画、战斗到 AI 的闭环链路蓝图组织方式清晰Controller/Character/Animation/AI 各司其职。核心设计思想是“动画驱动逻辑”通过 AnimNotify 将伤害、转向、连招状态精确绑定到动画时间轴上这是动作游戏原型中非常高效且易于迭代的方案。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑