You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中RTS游戏摄像机基于平面参考的四元数双轴旋转实现问题

RTS相机双轴旋转(无倾斜)实现方案

嘿,我完全懂你的需求:现在你的RTS相机只能单轴旋转,想要通过鼠标X控制左右转向(绕Y轴),鼠标Y控制俯仰(绕X轴),同时绝对不能让相机倾斜——这可是RTS相机的基本要求,我给你整理了一套完美适配的方案。

核心思路

要解决这个问题,关键是把两个轴向的旋转分开处理,并且永远锁定Z轴的旋转分量为0,这样就彻底杜绝了倾斜的可能。另外,RTS相机通常需要限制俯仰角度,避免玩家把相机转到不合理的位置(比如翻过来),这个细节也得加上。

修正后的完整代码

你需要替换原来的代码逻辑,改用单独的变量存储水平和垂直旋转角度,这样逻辑更清晰也更容易维护:

[SerializeField] private float camRotationSpeed = 0.2f; // 改成Speed语义更直观
[SerializeField] private float camSmoothness = 5f;
[SerializeField] private float minPitchAngle = -60f; // 最低俯视角度,可按需调整
[SerializeField] private float maxPitchAngle = 30f; // 最高仰视角度,可按需调整

private float yaw; // 绕Y轴的旋转角度(左右转向)
private float pitch; // 绕X轴的旋转角度(俯仰)

void Update()
{
    // 获取鼠标输入的增量
    float mouseX = Input.GetAxis("Mouse X") * camRotationSpeed;
    float mouseY = Input.GetAxis("Mouse Y") * camRotationSpeed;

    // 更新水平旋转(Y轴)
    yaw += mouseX;

    // 更新垂直旋转(X轴),同时限制角度防止相机翻转
    pitch -= mouseY;
    pitch = Mathf.Clamp(pitch, minPitchAngle, maxPitchAngle);

    // 构建目标旋转:Z轴强制设为0,彻底避免倾斜
    Quaternion targetRotation = Quaternion.Euler(pitch, yaw, 0f);

    // 平滑过渡到目标旋转,保持原有的流畅感
    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * camSmoothness);
}

关键细节说明

  • 分离旋转变量:用yaw(偏航,绕Y轴)和pitch(俯仰,绕X轴)分别存储两个方向的旋转角度,既可以独立控制,也方便做角度范围限制。
  • 锁定Z轴旋转:在构建欧拉角旋转时,第三个参数直接设为0,相机就永远不会出现倾斜,完全符合RTS游戏的视角需求。
  • 角度限制:用Mathf.Clamp把俯仰角度锁在合理范围内,防止玩家误操作把相机转到地面以下或者天顶以上,提升整体游戏体验。
  • 命名优化:把camRotationAmount改成camRotationSpeed,语义更清晰,后续维护起来更省心。

为什么原有代码需要调整?

你原来直接修改newRotation的方式,容易让不同轴向的旋转分量相互干扰,时间长了可能会积累不必要的Z轴旋转,导致相机倾斜。而分离存储角度再重新构建旋转的方式,能从根源上避免这个问题,逻辑也更清晰易懂。

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

火山引擎 最新活动