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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:03:14