Unity中基于Cinemachine实现右键拖拽环绕玩家的相机控制
解决CinemachineFreeLook结合Input System实现右键按住才环绕相机的问题
核心思路
不用禁用CinemachineInputProvider的AutoEnableInputs(禁用后会导致轴值停止更新),而是通过控制右键按住状态来切换相机输入的有效性,同时处理鼠标锁定与隐藏,实现类似Roblox的相机逻辑。
具体实现代码
替换你现有的CameraController脚本,以下是完整可运行版本:
using UnityEngine; using UnityEngine.InputSystem; using Cinemachine; public class CameraController : MonoBehaviour { [SerializeField] private CinemachineFreeLook freeLookCamera; private PlayerInputActions playerControls; private InputAction lookAction; private InputAction rightClickAction; private void Awake() { playerControls = new PlayerInputActions(); lookAction = playerControls.Player.Look; rightClickAction = playerControls.Player.Drag; // 对应你的右键绑定动作 } private void OnEnable() { playerControls.Enable(); rightClickAction.performed += OnRightClickPerformed; rightClickAction.canceled += OnRightClickCanceled; } private void OnDisable() { playerControls.Disable(); rightClickAction.performed -= OnRightClickPerformed; rightClickAction.canceled -= OnRightClickCanceled; // 退出时恢复鼠标状态 Cursor.lockState = CursorLockMode.None; Cursor.visible = true; } private void OnRightClickPerformed(InputAction.CallbackContext context) { // 按住右键时:锁定鼠标、隐藏光标、启用相机输入 Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; freeLookCamera.m_XAxis.m_InputAxisName = "Mouse X"; freeLookCamera.m_YAxis.m_InputAxisName = "Mouse Y"; } private void OnRightClickCanceled(InputAction.CallbackContext context) { // 松开右键时:解锁鼠标、显示光标、禁用相机输入 Cursor.lockState = CursorLockMode.None; Cursor.visible = true; freeLookCamera.m_XAxis.m_InputAxisName = ""; freeLookCamera.m_YAxis.m_InputAxisName = ""; } }
配置说明
- CinemachineInputProvider设置:保持
AutoEnableInputs为勾选状态,确保Look动作已正确绑定到Input Provider的X Axis和Y Axis(对应FreeLook相机的X、Y轴)。 - PlayerInputActions配置:将
Drag动作绑定到鼠标右键(Mouse -> Right Button),Look动作绑定到Mouse -> Delta。 - 脚本挂载:把脚本挂载到包含
CinemachineFreeLook组件的相机对象上,在Inspector中拖入对应的freeLookCamera引用。
原脚本无效原因
你禁用AutoEnableInputs后,CinemachineInputProvider会停止更新轴值,导致GetAxisValue()始终返回0。正确的逻辑是让Cinemachine负责输入处理,我们只在右键按住时开启输入通道,松开时关闭即可。
内容的提问来源于stack exchange,提问作者Vessbon
相关产品推荐
相关产品推荐

