Unity的Cursor.lockState

2025年8月24日,周日晚上


Cursor.lockState = CursorLockMode.Locked;这行代码在Unity中是​​将鼠标光标锁定到游戏窗口的中心,并隐藏鼠标光标​​。这是第一人称射击(FPS)、第三人称等类型游戏中实现视角控制的常用核心代码。

下面这个表格能帮你快速了解三种不同鼠标锁定模式的区别:

锁定模式 (CursorLockMode) 光标行为 可见性 典型应用场景
​Locked​ 锁定在游戏窗口中心,无法移动。鼠标移动数据仍可通过 Input.GetAxis("Mouse X/Y")获取。 ​强制隐藏​ ​,无论 Cursor.visible设置为何值。 FPS游戏、第一/第三人称视角控制
​Confined​ 光标可以自由移动,但被限制在游戏窗口的边界内,无法移出窗口。 正常显示,或由 Cursor.visible控制。 策略游戏、模拟经营游戏、有鼠标交互的UI
​None​ 无任何限制,光标可以自由移动到屏幕的任何位置,包括游戏窗口之外。 正常显示,或由 Cursor.visible控制。 游戏暂停菜单、主界面、系统设置

🔧 如何使用与注意事项

基本用法

通常,你会在玩家控制脚本的 Update()Start()方法中设置这些状态。

复制代码
using UnityEngine;

public class MouseControl : MonoBehaviour
{
    void Start()
    {
        // 锁定并隐藏鼠标
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false; // 在Locked模式下,此行可省略,但明确设置是好习惯
    }

    void Update()
    {
        // 通常用ESC键来解锁鼠标,方便玩家操作
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;
        }
        // 再次点击鼠标时重新锁定(可选)
        if (Input.GetMouseButtonDown(0) && Cursor.lockState == CursorLockMode.None)
        {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        }
    }
}
重要注意事项
  1. ​版本差异​ ​:在较旧的Unity版本(如Unity4.x)中,使用的是 Screen.lockCursor属性。从Unity5.x开始,官方推荐使用 Cursor.lockStateCursor.visible来替代。

  2. Locked模式优先级最高​ ​:在 CursorLockMode.Locked模式下,无论 Cursor.visible的值设置为 true还是 false,硬件光标都会被强制隐藏。 因此,若需要光标可见,需先将锁定模式设为 NoneConfined

  3. ​引擎自动处理​​:在编辑器中进行游戏测试时,Unity编辑器通常会自动处理鼠标锁定和解锁的切换。但当游戏获得焦点时,设定的状态会生效。

  4. ​平台差异​​:这些功能在绝大多数平台上都得到支持,但个别平台的具体行为可能存在细微差异,进行多平台发布时需进行测试。

💡 实战技巧:实现平滑的鼠标视角控制

当你锁定鼠标后,通常需要获取鼠标的移动输入来控制摄像机旋转。这里有一个简单的示例:

复制代码
public class FPSCameraLook : MonoBehaviour
{
    public float mouseSensitivity = 100.0f;
    public Transform playerBody; // 玩家的父物体,用于左右旋转

    private float xRotation = 0f;

    void Update()
    {
        // 只有当鼠标被锁定时才处理视角旋转
        if (Cursor.lockState == CursorLockMode.Locked)
        {
            float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
            float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

            xRotation -= mouseY;
            xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 限制上下抬头幅度

            transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
            playerBody.Rotate(Vector3.up * mouseX);
        }
    }
}

⚠️ 常见问题排查

如果遇到鼠标行为异常,可以检查以下几点:

  • ​状态不同步​ ​:确保在所有需要改变光标状态的场景(如暂停游戏、打开菜单、切换场景)中都正确地更新了 Cursor.lockStateCursor.visible

  • ​UI冲突​ ​:如果使用了复杂的UI系统(如Unity的UGUI或第三方插件),确保在打开UI界面时没有忘记解锁鼠标(设置为 CursorLockMode.None)。

  • ​帧率影响​​:极低的帧率可能会影响鼠标输入采样的平滑度,但这通常不影响锁定状态本身。

希望这些信息能帮助你更好地理解和使用Unity的鼠标锁定功能。

相关推荐
ellis19701 小时前
Unity插件SafeArea Helper适配异形屏详解
unity
nnsix2 小时前
Unity Physics.Raycast的 QueryTriggerInteraction枚举作用
unity·游戏引擎
地狱为王2 小时前
Cesium for Unity叠加行政区划线
unity·gis·cesium
小贺儿开发11 小时前
Unity3D 八大菜系连连看
游戏·unity·互动·传统文化
在路上看风景11 小时前
25. 屏幕像素和纹理像素不匹配
unity
ۓ明哲ڪ13 小时前
Unity功能——创建新脚本时自动添加自定义头注释
unity·游戏引擎
熬夜敲代码的小N13 小时前
Unity大场景卡顿“急救包”:从诊断到落地的全栈优化方案
java·unity·游戏引擎
派葛穆14 小时前
Unity-realvirtual-S7通讯快速配置(未完结)
unity·游戏引擎
w-白兰地1 天前
【Addressable远端加载资源】
unity·addressable·资源加载
小张不爱写代码1 天前
[Unity 技巧] 如何自定义 Inspector 变量显示名称 (CustomLabel)
unity·游戏引擎