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;
}
}
}
重要注意事项
-
版本差异 :在较旧的Unity版本(如Unity4.x)中,使用的是
Screen.lockCursor
属性。从Unity5.x开始,官方推荐使用Cursor.lockState
和Cursor.visible
来替代。 -
Locked
模式优先级最高 :在CursorLockMode.Locked
模式下,无论Cursor.visible
的值设置为true
还是false
,硬件光标都会被强制隐藏。 因此,若需要光标可见,需先将锁定模式设为None
或Confined
。 -
引擎自动处理:在编辑器中进行游戏测试时,Unity编辑器通常会自动处理鼠标锁定和解锁的切换。但当游戏获得焦点时,设定的状态会生效。
-
平台差异:这些功能在绝大多数平台上都得到支持,但个别平台的具体行为可能存在细微差异,进行多平台发布时需进行测试。
💡 实战技巧:实现平滑的鼠标视角控制
当你锁定鼠标后,通常需要获取鼠标的移动输入来控制摄像机旋转。这里有一个简单的示例:
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的鼠标锁定功能。