UE5.8 Gameplay Cameras 专题系列

UE5.8 Gameplay Cameras 专题(九):输入与 Control Rotation,鼠标、手柄和自动回正怎么处理

讲 Enhanced Input、InputAxisBinding2D、RawInputAxisBinding2D、InputAccumulator2D、AutoRotate、DrivenControlRotation、ViewRotationMode 和 GameplayControlRotationComponent。

总览

相机输入最容易乱,因为 UE 里同时存在 PlayerController ControlRotation、Pawn 朝向、Camera Pose Rotation、Enhanced Input Action、自动回正和切换时的过渡旋转。先别急着调灵敏度,先确认“谁拥有旋转”。

UE5.8 Gameplay Cameras 专题(九):输入与 Control Rotation,鼠标、手柄和自动回正怎么处理 配图
相机输入的核心是:谁读输入,谁保存旋转,谁把结果同步回 PlayerController。

架构分析

输入节点产出的是相机内部使用的二维输入值;ControlRotation 是 PlayerController 级别的朝向;最终 CameraPose Rotation 是本帧镜头结果。三者可以同步,但不要混为一个变量。切换 Rig 时,保持 Aim 的关键是让新旧 Rig 对“当前视角方向”有同一个解释。

输入节点

UInputAxisBinding2DCameraNode 读取一个或多个 UInputAction,乘以 Multiplier,并可选择是否累计。它相当于 Raw Input + Accumulator 的组合。你也可以拆成 URawInputAxisBinding2DCameraNodeUInputAccumulator2DCameraNode,分别控制读取和累计。

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,还要看 EGameplayCamerasViewRotationModeNone 表示不处理 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.h
  • GameplayCameras/Public/Nodes/Input/AutoRotateInput2DCameraNode.h
  • GameplayCameras/Public/Nodes/Input/DrivenControlRotationCameraNode.h
  • GameplayCameras/Public/GameFramework/GameplayControlRotationComponent.h