总览
这一篇直接做一个常见第三人称 Rig。目标不是炫技,而是把 SpringArm 常见能力拆成清晰节点:跟随谁、绕哪里转、输入怎么来、怎么平滑、怎么防穿墙、FOV 怎么调。
推荐节点链
CR_ThirdPerson_Follow
AttachToPlayerPawn
BoomArm
InputAxisBinding2D
AutoRotateInput2D
DampenPosition
DampenRotation
CollisionPush
FieldOfView
PostProcess
BoomArm 的 InputSlot 可以接 InputAxisBinding2D。如果没接,它会使用 PlayerController 的 ViewRotation。这个特性适合第一版测试;项目正式版建议显式接 Enhanced Input 的 Look Action。
架构分析
这个 Rig 的职责是生成“普通移动时的稳定镜头”。Attach 决定参考系,BoomArm 决定相机围绕支点的方向和距离,Dampen 消除角色运动尖峰,CollisionPush 处理环境遮挡,FOV/PostProcess 只做最后的视觉参数。每个节点只解决一个问题,调试时就能逐个关闭。
参数建议
| 参数 | 初始值建议 | 说明 |
|---|---|---|
| BoomOffset | X=0, Y=60, Z=70 | 右肩第三人称 |
| ArmLength | 250-450 | 根据角色体型调 |
| ForwardDamping | 0.08-0.18 | 急停时减少晃动 |
| LateralDamping | 0.06-0.15 | 横移别拖太久 |
| CollisionSphereRadius | 8-14 | 防止镜头穿墙 |
| FOV | 80-95 | TPS 常见范围 |
使用案例
探索状态用正常臂长和 FOV;冲刺时启动 Global Modifier,把 FOV 提高 5-10 度,BoomOffset 稍微拉后;进入室内区域时通过 ParameterSetter 缩短臂长;进入瞄准状态时切到 Aim Rig 或覆盖肩位和 FOV。
CollisionPush 怎么调
UCollisionPushCameraNode 默认安全位置可以取 Pivot 或 Pawn。它使用 Sphere 进行碰撞检测,命中后把镜头推向安全位置。bRunAsyncCollision 可以异步跑碰撞,性能更好但会晚一帧,近距离高速移动时要观察是否可接受。
调试顺序:先关 Dampen,只看 Collision 是否正确;再开 Dampen;最后加输入和自动回正。否则你看到的“穿墙”可能其实是阻尼把镜头拖过去了。
输入和自动回正
InputAxisBinding2D 把 Raw Input 和 Accumulator 合在一起。AutoRotateInput2D 可以在玩家停下输入后按 Facing、Movement、MovementOrFacing 或 Zero 方向回正。手柄游戏建议 WaitTime 稍长,鼠标游戏建议更保守,避免玩家觉得相机抢控制。
项目落地
把 Follow Rig 做成项目模板。每个角色先继承默认参数,只覆盖高度、肩位、臂长和 FOV。不要为每个角色复制一整套节点树,否则后期改碰撞策略会非常痛苦。
常见坑
- Dampen 太大:镜头像拖在橡皮筋上,战斗读输入会慢。
- Collision Sphere 太小:墙角穿帮;太大:狭窄空间一直顶到角色背后。
- 自动回正太积极:玩家停止输入就被抢方向。
- 在 Follow Rig 里硬写 Aim 逻辑:Aim 应该是参数覆盖或独立 Rig。
- 忘记先做无阻尼调试:多种平滑叠在一起很难判断问题来源。
源码依据
UBoomArmCameraNode 暴露 BoomOffset、BoomLengthInterpolator、InputSlot 和 AdditiveRotation;UDampenPositionCameraNode 按 Forward/Lateral/Vertical 三轴阻尼;UCollisionPushCameraNode 提供 SafePosition、CustomSafePosition、CollisionSphereRadius、CollisionChannel、Push/PullInterpolator 和异步碰撞选项。
源码路径索引
GameplayCameras/Public/Nodes/Common/BoomArmCameraNode.hGameplayCameras/Public/Nodes/Common/DampenPositionCameraNode.hGameplayCameras/Public/Nodes/Collision/CollisionPushCameraNode.hGameplayCameras/Public/Nodes/Input/InputAxisBinding2DCameraNode.h