You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity FPS手游相机控制问题:实现摇杆单次旋转并保留角度

解决Unity FPS摇杆单次旋转并保留角度的问题

问题核心是你直接用_input.look的绝对值设置旋转,而_input.look是摇杆的相对偏移(回到中心时为0),导致每次操作都会重置到初始角度。正确的做法是累加输入的旋转增量到当前角度,而不是覆盖。

实现步骤

  • 定义变量存储当前的旋转角度(偏航Yaw和俯仰Pitch),避免每次都从初始值计算
  • 仅在摇杆有有效输入时,将输入偏移量转换成旋转增量并累加
  • 将累加后的角度应用到相机/玩家对象上
  • 可选:限制俯仰角度,避免FPS视角过度抬头/低头

修改后的代码示例

首先在类中添加成员变量:

// 存储当前的旋转角度(Yaw:左右旋转,Pitch:上下旋转)
private float _currentYaw;
private float _currentPitch;
// 摇杆输入阈值,过滤微小误触
public float InputThreshold = 0.1f;
// 可选:限制俯仰角度范围
public float MinPitch = -80f;
public float MaxPitch = 80f;

然后修改CameraRotation方法:

void CameraRotation()
{
    // 仅当摇杆输入超过阈值时处理旋转
    if (_input.look.magnitude > InputThreshold)
    {
        // 计算本次输入带来的旋转增量
        float yawIncrement = _input.look.x * RotationSpeed;
        float pitchIncrement = -_input.look.y * RotationSpeed;

        // 累加到当前旋转角度
        _currentYaw += yawIncrement;
        _currentPitch += pitchIncrement;

        // 限制俯仰角度(可选,根据需求调整)
        _currentPitch = Mathf.Clamp(_currentPitch, MinPitch, MaxPitch);
    }

    // 将当前角度转换成四元数并应用
    transform.rotation = Quaternion.Euler(_currentPitch, _currentYaw, 0f);
}

代码说明

  • _currentYaw和_currentPitch会持续保存当前的旋转状态,每次摇杆输入只会在现有角度上增加增量
  • InputThreshold用于过滤摇杆的微小抖动,避免误触发
  • 俯仰角度限制是FPS游戏的常规操作,防止视角翻转到不合理的角度
  • 这里的RotationSpeed不需要乘以Time.deltaTime,因为我们是单次触发旋转,不是持续帧更新(如果需要让单次旋转有平滑过渡,可以额外加插值逻辑,但你的需求是单次完成后停止,所以直接累加即可)

如果需要实现类似触摸板的"拖动多少转多少"的线性对应,只需要调整RotationSpeed的数值,让输入的偏移量和旋转角度成比例即可。

内容的提问来源于stack exchange,提问作者Operator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:18