← 返回项目技术总览

本文记录了一个用于验证角色变身、飞行、加速遁速效果的技术预研项目的完整开发过程。该项目基于 UE 5.8.1 引擎,使用 C++ 实现核心逻辑,蓝图仅用于配置资产引用。

开发记录前言

一、项目目标

实现一个完整的角色形态变换与飞行遁速系统,包含以下功能:

  1. T 键进入/退出变身形态
  2. 变身后角色自动向前飞行,并可用 W/A/S/D 控制上下左右方向
  3. 变身后视野(FOV)从 80 放大到 120
  4. 变身后按鼠标右键进入加速模式,速度显著提升,并播放一次性加速特效
  5. 再次按鼠标右键退出加速模式
  6. 变身瞬间播放闪光过渡特效,并在 0.4 秒后正式切换形态
  7. 退出变身时角色立即停止移动,不再继续前冲
  8. 角色形态切换时伴随溶解过渡效果(预留 MPC 材质参数集合)

二、项目结构与技术栈

关键资产

资产作用
BP_ThirdPersonCharacter官方第三人称角色蓝图,父类改为 ATransformCharacter
BP_Projectile_Ice变身特效蓝图 Actor,包含多个 Niagara 组件
NS_StarSkill002变身后的常驻紫色球粒子
NS_Dash变身爆发拖尾特效(已改为 Ribbon 渲染器)
NS_FlyLine_001自定义拖尾特效
NS_JiaSu加速特效
NS_SpriteSpawn变身闪光过渡特效
MPC_Dissolve溶解效果材质参数集合

三、制作方法与核心实现

3.1 输入绑定

由于项目使用的是传统 UInputComponent 而非 Enhanced Input,因此直接通过 BindKey 绑定按键:

绑定位置:ATransformCharacter::SetupPlayerInputComponent

3.2 形态切换流程

T 键后,先进入 0.4 秒闪光过渡阶段。

进入变身

  1. 调用 StartDissolveOut() 开始溶解淡出
  2. 在角色位置生成 NS_SpriteSpawn 闪光特效
  3. 0.4 秒后执行 ExecuteEnterTransform()
  4. 隐藏角色网格,生成变身特效 Actor,切换到 MOVE_Flying 模式
  5. 设置 FOV 为 120

退出变身

  1. 立即标记 bIsInTransformedForm = false,停止飞行逻辑
  2. 立即清零速度、停止移动、切换回 MOVE_Walking
  3. 销毁变身特效 Actor,显示角色网格
  4. 调用 StartDissolveIn() 开始溶解淡入
  5. 0.4 秒后执行 ExecuteExitTransform()
  6. 恢复 FOV 为 80

3.3 飞行控制

变身后在 Tick() 中实现飞行:

状态自动飞行速度操控速度
普通1200 cm/s800 cm/s
加速5000 cm/s4000 cm/s

早期使用 AddMovementInput 实现,但发现受 CharacterMovementComponent::MaxAcceleration 限制,加速感不明显。最终改为直接计算 DesiredVelocity,通过 FMath::VInterpTo 平滑设置 MoveComp->Velocity,加速感立竿见影。

3.4 加速系统

按鼠标右键切换 bIsBoosting 状态:

3.5 Niagara 特效与速度传递

变身后生成的特效 Actor 包含多个 Niagara 组件。在 Tick() 中获取角色世界速度 GetVelocity(),并通过 SetVariableVec3("User.FlyVelocity", FlyVel) 传递给 Niagara,用于驱动拖尾、惯性甩尾等粒子效果。

四、开发过程中遇到的问题与修复

问题根因修复
T 键无反应SetupPlayerInputComponentPlayerInputComponent 为 NULL直接在该函数内使用 BindKey 绑定 T
变身后看不到 Niagara 特效路径写错;蓝图 CDO 将 FormNiagaraSystem 序列化为 None修正路径为 /Game/Test_02/VFX/BlackVFX/NS_StarSkill002;用 Python 脚本修复 CDO 引用
退出变身后粒子未消失退出时只隐藏网格,未销毁特效 Actor调用 SpawnedTransformVFX->Destroy() 并清空指针
变身后的 FOV 修改不生效APlayerController::SetFOV() 被相机组件覆盖改为 PlayerCameraManager->SetFOV()
退出变身后仍前冲CharacterMovementComponent 保留惯性速度立即标记非变身、清零 Velocity、调用 StopMovementImmediately()
加速特效生效但速度不变蓝图 CDO 将速度序列化为 0;AddMovementInput 受 MaxAcceleration 限制BeginPlay() 强制重设速度;改为直接设置 Velocity
角色材质丢失变灰M_Mannequin 添加溶解节点时 OneMinus 未正确连接删除错误节点,用正确引脚名 "None" 重新连接
Ribbon 拖尾不显示Niagara 使用本地空间,自身速度为 0改为世界空间模拟,添加 Inherit VelocityDrag 模块
蓝图编译错误弹窗模板自带废弃资产 BP_Dummy_CharacterW_Projectiles_HUD与变身系统无关,点击"编辑器中运行"继续测试

五、改过的代码文件

5.1 Source/Test/Public/TransformCharacter.h

5.2 Source/Test/Private/TransformCharacter.cpp

六、关键参数汇总

参数说明
普通自动飞行速度1200 cm/s变身后不按右键的自动前进速度
普通操控速度800 cm/s变身后 WASD 的操控速度
加速自动飞行速度5000 cm/s按右键加速后的自动前进速度
加速操控速度4000 cm/s按右键加速后的 WASD 操控速度
变身 FOV120变身后的视野
默认 FOV80退出变身后恢复的视野
闪光延迟0.4 s按 T 后多久正式变身
变身冷却0.5 s防止连续触发的冷却时间
速度插值速率8.0VInterpTo 的过渡速率

七、经验总结

  1. 蓝图 CDO 会覆盖 C++ 默认值:对于关键配置属性(如 Niagara 引用、速度值),要么在 BeginPlay() 中强制设置,要么在构造函数中用 ConstructorHelpers::FObjectFinder 硬编码路径。
  2. 飞行速度优先用直接设置 VelocityAddMovementInput 虽然更符合角色移动框架,但受 MaxAcceleration 限制,做快速加速感不如直接设置 Velocity 明显。
  3. FOV 设置要走 PlayerCameraManager:直接设置 PlayerController 的 FOV 会被相机组件覆盖。
  4. 退出变身要立刻停止移动:否则角色会因为惯性继续前冲,体验很差。
  5. Niagara 拖尾需要世界空间 + Inherit Velocity:本地空间下粒子没有自身速度,无法形成拖尾。
  6. 修改 .h 后必须完整重编译:新增 UPROPERTY/UFUNCTION 属于反射结构变更,Live Coding 无法热替换。

迁移提示。当前实现位于独立测试项目 Test_02,若要将 ATransformCharacter 迁入 CultivatingImmortality_RPG 主项目,需同步迁移 BP_Projectile_Ice 及其引用的 Niagara 资产,并替换 TEST_API 为主项目模块 API 宏。