本文记录了一个用于验证角色变身、飞行、加速遁速效果的技术预研项目的完整开发过程。该项目基于 UE 5.8.1 引擎,使用 C++ 实现核心逻辑,蓝图仅用于配置资产引用。
— 开发记录前言
一、项目目标
实现一个完整的角色形态变换与飞行遁速系统,包含以下功能:
- 按
T键进入/退出变身形态 - 变身后角色自动向前飞行,并可用
W/A/S/D控制上下左右方向 - 变身后视野(FOV)从 80 放大到 120
- 变身后按鼠标右键进入加速模式,速度显著提升,并播放一次性加速特效
- 再次按鼠标右键退出加速模式
- 变身瞬间播放闪光过渡特效,并在 0.4 秒后正式切换形态
- 退出变身时角色立即停止移动,不再继续前冲
- 角色形态切换时伴随溶解过渡效果(预留 MPC 材质参数集合)
二、项目结构与技术栈
- 引擎版本:Unreal Engine 5.8.1
- 开发方式:C++ 核心逻辑 + 蓝图配置引用
- 核心 C++ 类:
ATransformCharacter(继承自ACharacter)
关键资产
| 资产 | 作用 |
|---|---|
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 绑定按键:
EKeys::T:触发变身/取消变身EKeys::RightMouseButton:切换加速模式
绑定位置:ATransformCharacter::SetupPlayerInputComponent
3.2 形态切换流程
按 T 键后,先进入 0.4 秒闪光过渡阶段。
进入变身
- 调用
StartDissolveOut()开始溶解淡出 - 在角色位置生成
NS_SpriteSpawn闪光特效 - 0.4 秒后执行
ExecuteEnterTransform() - 隐藏角色网格,生成变身特效 Actor,切换到
MOVE_Flying模式 - 设置 FOV 为 120
退出变身
- 立即标记
bIsInTransformedForm = false,停止飞行逻辑 - 立即清零速度、停止移动、切换回
MOVE_Walking - 销毁变身特效 Actor,显示角色网格
- 调用
StartDissolveIn()开始溶解淡入 - 0.4 秒后执行
ExecuteExitTransform() - 恢复 FOV 为 80
3.3 飞行控制
变身后在 Tick() 中实现飞行:
- 自动向前飞行:
ViewForward * AutoFlySpeed W:向上飞(世界 Z+)S:向下飞(世界 Z-,带地面检测,避免穿地)A:向左飞(视角左方)D:向右飞(视角右方)
| 状态 | 自动飞行速度 | 操控速度 |
|---|---|---|
| 普通 | 1200 cm/s | 800 cm/s |
| 加速 | 5000 cm/s | 4000 cm/s |
早期使用 AddMovementInput 实现,但发现受 CharacterMovementComponent::MaxAcceleration 限制,加速感不明显。最终改为直接计算 DesiredVelocity,通过 FMath::VInterpTo 平滑设置 MoveComp->Velocity,加速感立竿见影。
3.4 加速系统
按鼠标右键切换 bIsBoosting 状态:
- 进入加速时:在角色位置生成
NS_JiaSu加速特效,速度切换到加速参数 - 退出加速时:仅恢复速度,不再播放特效
3.5 Niagara 特效与速度传递
变身后生成的特效 Actor 包含多个 Niagara 组件。在 Tick() 中获取角色世界速度 GetVelocity(),并通过 SetVariableVec3("User.FlyVelocity", FlyVel) 传递给 Niagara,用于驱动拖尾、惯性甩尾等粒子效果。
四、开发过程中遇到的问题与修复
| 问题 | 根因 | 修复 |
|---|---|---|
按 T 键无反应 | SetupPlayerInputComponent 中 PlayerInputComponent 为 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 Velocity 与 Drag 模块 |
| 蓝图编译错误弹窗 | 模板自带废弃资产 BP_Dummy_Character、W_Projectiles_HUD | 与变身系统无关,点击"编辑器中运行"继续测试 |
五、改过的代码文件
5.1 Source/Test/Public/TransformCharacter.h
- 新增
BoostEffect:加速 Niagara 特效 - 新增
bIsBoosting:加速状态标记 - 新增
NormalFlySpeed、NormalSteerSpeed、BoostFlySpeed、BoostSteerSpeed:飞行速度参数 - 新增
OnBoostInput():鼠标右键加速输入处理 - 新增
TransformFlashEffect、TransformFlashDelay:闪光过渡特效与延迟 - 新增
DissolveMPC、DissolveParamName:溶解效果 MPC 资源与参数名 - 新增
TransformVFXBlueprint、SpawnedTransformVFX:变身特效蓝图 Actor 类与实例 - 新增溶解相关私有成员与函数
5.2 Source/Test/Private/TransformCharacter.cpp
- 构造函数中加载
BP_Projectile_Ice、NS_SpriteSpawn、NS_JiaSu等默认资产 BeginPlay()中设置飞行速度默认值,防止蓝图 CDO 覆盖SetupPlayerInputComponent()中绑定T键和鼠标右键Tick()中实现溶解动画、飞行控制、速度传递 NiagaraOnTransformInput()实现变身/退出变身的完整流程OnBoostInput()实现加速模式切换与一次性特效播放ExecuteEnterTransform()/ExecuteExitTransform()实现正式变身与退出StartDissolveOut()/StartDissolveIn()控制溶解方向
六、关键参数汇总
| 参数 | 值 | 说明 |
|---|---|---|
| 普通自动飞行速度 | 1200 cm/s | 变身后不按右键的自动前进速度 |
| 普通操控速度 | 800 cm/s | 变身后 WASD 的操控速度 |
| 加速自动飞行速度 | 5000 cm/s | 按右键加速后的自动前进速度 |
| 加速操控速度 | 4000 cm/s | 按右键加速后的 WASD 操控速度 |
| 变身 FOV | 120 | 变身后的视野 |
| 默认 FOV | 80 | 退出变身后恢复的视野 |
| 闪光延迟 | 0.4 s | 按 T 后多久正式变身 |
| 变身冷却 | 0.5 s | 防止连续触发的冷却时间 |
| 速度插值速率 | 8.0 | VInterpTo 的过渡速率 |
七、经验总结
- 蓝图 CDO 会覆盖 C++ 默认值:对于关键配置属性(如 Niagara 引用、速度值),要么在
BeginPlay()中强制设置,要么在构造函数中用ConstructorHelpers::FObjectFinder硬编码路径。 - 飞行速度优先用直接设置 Velocity:
AddMovementInput虽然更符合角色移动框架,但受MaxAcceleration限制,做快速加速感不如直接设置Velocity明显。 - FOV 设置要走
PlayerCameraManager:直接设置PlayerController的 FOV 会被相机组件覆盖。 - 退出变身要立刻停止移动:否则角色会因为惯性继续前冲,体验很差。
- Niagara 拖尾需要世界空间 + Inherit Velocity:本地空间下粒子没有自身速度,无法形成拖尾。
- 修改
.h后必须完整重编译:新增 UPROPERTY/UFUNCTION 属于反射结构变更,Live Coding 无法热替换。
迁移提示。当前实现位于独立测试项目 Test_02,若要将 ATransformCharacter 迁入 CultivatingImmortality_RPG 主项目,需同步迁移 BP_Projectile_Ice 及其引用的 Niagara 资产,并替换 TEST_API 为主项目模块 API 宏。