总览
相机输入最容易乱,因为 UE 里同时存在 PlayerController ControlRotation、Pawn 朝向、Camera Pose Rotation、Enhanced Input Action、自动回正和切换时的过渡旋转。先别急着调灵敏度,先确认“谁拥有旋转”。
架构分析
输入节点产出的是相机内部使用的二维输入值;ControlRotation 是 PlayerController 级别的朝向;最终 CameraPose Rotation 是本帧镜头结果。三者可以同步,但不要混为一个变量。切换 Rig 时,保持 Aim 的关键是让新旧 Rig 对“当前视角方向”有同一个解释。
输入节点
UInputAxisBinding2DCameraNode 读取一个或多个 UInputAction,乘以 Multiplier,并可选择是否累计。它相当于 Raw Input + Accumulator 的组合。你也可以拆成 URawInputAxisBinding2DCameraNode 和 UInputAccumulator2DCameraNode,分别控制读取和累计。
InputAxisBinding2D
AxisActions: IA_Look
Multiplier: X=1.0, Y=-1.0
bIsAccumulated: true
手柄项目通常 X/Y 都走累计;鼠标项目要小心平台输入已经是 Delta 还是 Axis。调试时先把 AutoRotate 关掉,只看 InputValue 是否随输入变化。
AutoRotate
UAutoRotateInput2DCameraNode 可以在玩家停止输入后,把相机重新对齐到 Facing、Movement、MovementOrFacing 或 Zero。它有 WaitTime、DeactivationThreshold、Interpolator、FreezeControlRotation、EnableAutoRotate、AutoRotateYaw、AutoRotatePitch。
推荐策略:探索状态允许 MovementOrFacing 自动回正;瞄准状态关闭自动回正;锁定状态由目标构图驱动,不让自动回正抢控制;载具状态按移动方向回正。
Control Rotation
UDrivenControlRotationCameraNode 的注释很关键:它在当前活动 Camera Rig 中提供 ControlRotation 的 yaw/pitch,混出时会“脱离”并基于最后活动 ControlRotation 应用 Delta。这正是为了解决 Rig 切换时保持玩家 Aim 的问题。
如果使用 AGameplayCamerasPlayerCameraManager,还要看 EGameplayCamerasViewRotationMode。None 表示不处理 ViewRotation;PreviewUpdate 会跑一遍轻量相机更新,计算更合理的视角旋转,适合多个不同朝向 Rig 混合时保持瞄准。
组件方案
UGameplayControlRotationComponent 是官方示例组件,用来和 GameplayCameraComponent 协作管理玩家 ControlRotation。它可以绑定 AxisActions,并在 Tick 中根据相机系统结果设置 PlayerController 的 ControlRotation。
使用案例
探索状态用玩家输入累计 yaw/pitch,并在停输入后缓慢回正到移动方向;瞄准状态继续读同一个 IA_Look,但降低 Multiplier 并关闭 AutoRotate;锁定状态只允许右摇杆切换目标,镜头朝向由 LockOn Rig 维护;退出锁定时用 PreviousYawPitch 或 DrivenControlRotation 保持手感。
项目落地
建立输入策略表:
| 状态 | 输入源 | 自动回正 | ControlRotation |
|---|---|---|---|
| Explore | IA_Look 累计 | MovementOrFacing | 可同步 |
| Aim | IA_Look 累计,低灵敏度 | 关闭 | 强同步 |
| LockOn | 切目标输入 | 关闭 | 由 Rig 保持目标 |
| Dialogue | 禁止或弱输入 | 关闭 | 不回写 |
| Vehicle | IA_Look + 车体方向 | Movement | 可同步 |
常见坑
- InputAction 没加到 Mapping Context:节点存在但永远读不到输入。
- 鼠标 Y 轴方向反了:先调 Multiplier,不要改一堆节点。
- AutoRotate 和锁定 Rig 同时控制朝向:会互相拉扯。
- 切换 Rig 时 Aim 跳一下:检查 InitialOrientation、DrivenControlRotation 和 ViewRotationMode。
- 每个 Rig 自己定义输入 Action:建议统一输入槽,避免状态切换丢输入。
源码依据
UInputAxisBinding2DCameraNode 暴露 AxisActions、Multiplier 和 bIsAccumulated;UAutoRotateInput2DCameraNode 支持 Facing/Movement/MovementOrFacing/Zero;UGameplayControlRotationComponent 可绑定 AxisActions 并激活玩家控制旋转管理;AGameplayCamerasPlayerCameraManager 提供 ViewRotationMode。
源码路径索引
GameplayCameras/Public/Nodes/Input/InputAxisBinding2DCameraNode.hGameplayCameras/Public/Nodes/Input/AutoRotateInput2DCameraNode.hGameplayCameras/Public/Nodes/Input/DrivenControlRotationCameraNode.hGameplayCameras/Public/GameFramework/GameplayControlRotationComponent.h