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.lockState和 Cursor.visible来替代。

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

  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.lockState和 Cursor.visible。

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

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

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

相关推荐
阿松爱学习11 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
淡海水13 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
辻弋2015 天前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
Martina_03215 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
小贺儿开发5 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
WarPigs7 天前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子8 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
淡海水9 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发9 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水9 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc