Unity右键瞄准相机回正角度异常,如何跨if语句传递布尔变量状态
核心问题原因
你的逻辑错误来自两处:
isCameraRight是定义在Update函数内的局部变量,Unity每帧执行Update时都会把它重新初始化为true,你按下右键时修改的状态下一帧直接就被重置了,松开时读到的永远是初始值,逻辑自然不会正常。- 把按键抬起的判断嵌套在按键按下的判断里完全不可行:
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
相关产品推荐
相关产品推荐

