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

Unity右键瞄准相机回正角度异常,如何跨if语句传递布尔变量状态

核心问题原因

你的逻辑错误来自两处:

  1. isCameraRight 是定义在Update函数内的局部变量,Unity每帧执行Update时都会把它重新初始化为true,你按下右键时修改的状态下一帧直接就被重置了,松开时读到的永远是初始值,逻辑自然不会正常。
  2. 把按键抬起的判断嵌套在按键按下的判断里完全不可行:Input.GetMouseButtonDown(1) 只在右键按下的那一帧返回true,而你抬起右键的帧肯定不会触发这个外层条件,内层逻辑永远跑不到。
修复方案

把isCameraRight改为类级别的成员变量,跨帧保存你按下右键时记录的瞄准方向,松开时直接用这个保存的方向回正,完全不需要管松开时鼠标的位置,就能解决中途移动鼠标导致多旋转的问题。

完整修正后的代码

// 把变量定义在类内部、Update函数外面,作为成员变量跨帧保存状态
private bool isCameraRight;
public Cinemachine.CinemachineVirtualCamera cinemachineVirtualCamera;

private void Update()
{
    var mouse = Input.mousePosition;
    // 只在右键按下的那一刻判断鼠标位置,记录方向并执行瞄准逻辑
    if (Input.GetMouseButtonDown(1))
    {
        if (mouse.x > Screen.width / 2)
        {
            transform.Rotate(0, 25, 0);
            cinemachineVirtualCamera.m_Lens.FieldOfView = 35;
            isCameraRight = true;
        }
        else
        {
            transform.Rotate(0, -25, 0);
            cinemachineVirtualCamera.m_Lens.FieldOfView = 35;
            isCameraRight = false;
        }
    }
    // 只在右键松开的那一刻,用之前保存的方向回正,和当前鼠标位置无关
    if (Input.GetMouseButtonUp(1))
    {
        if (isCameraRight)
        {
            transform.Rotate(0, -25, 0);
        }
        else
        {
            transform.Rotate(0, 25, 0);
        }
        cinemachineVirtualCamera.m_Lens.FieldOfView = 40;
    }
}

额外说明

你之前代码里的Mathf.Lerp用法是错的:Lerp的第三个参数是0-1范围的插值系数,填15、37等价于直接填1,也就是直接返回第二个参数的目标值,完全没有插值效果。如果你需要平滑过渡旋转和FOV,可以调整为每帧插值的逻辑,修改参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 18:21:02