以下代码只有在我按下Escape键后左键点击鼠标时才会锁定光标。谁能给我一个克服这个问题的方法?
public class lockCursor : MonoBehaviour
{
public bool locked = true;
// Start is called before the first frame update
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
if (locked == false)
{
Debug.Log("locked");
Cursor.lockState = CursorLockMode.Locked;
locked = true;
}
else
{
Debug.Log("Unlocked");
Cursor.lockState = CursorLockMode.None;
locked = false;
}
}
}
}
正如API中所说 Cursor.lockState
在编辑器中,当出现以下情况时,光标会自动复位。逃避 或切换应用程序时。
由于escape在Unity Editor中具有特殊作用,当按下它时,GameView会失去焦点。
没有一个真正的(琐碎的)方法来解决这个问题,因为它需要在Unity Editor本身有机会处理excel按下之前拦截他们的按键。(这将总是发生在它被传递给玩家之前-> 你的代码。)
你要做的 可以 然而,可以简单地使用不同的KeyCode,只用于编辑器,并且只在构建过程中进行转义,如
#if UNITY_EDITOR
if(Input.GetKeyDown(KeyCode.E))
#else
if(Input.GetKeyDown(KeyCode.Escape))
#endif
{
...
你可以用 E
和任何其他你想用来 "模拟转义键 "的KeyCode一起,只在Unity编辑器中使用。(也请看 依赖平台的编译)
正如derHugo在他的评论中提到的,你的问题就在于。API 对于 Cursor.lockState
在这里,它说:
"在编辑器中,光标在以下情况下会自动复位
escape
被按下,或在切换应用程序时。在单机版播放器中,您可以完全控制鼠标光标,但切换应用程序仍然会重置光标。"
当你去按 Escape
它将你从应用程序游戏窗口中移除。这就是为什么会出现你的光标不再被锁定的情况。这也是为什么当你点击回到游戏中时,它就会进入锁定状态。同样的事情可以用你的代码来演示,启动游戏,然后切换到另一个显示器上的另一个窗口。然后把鼠标移回到游戏窗口所在的屏幕上。它会出现好像不再处于锁定状态......直到你在游戏中点击,它再次识别出光标。
为了解决你的问题,我建议你使用除以下键以外的任何键。KeyCode.Escape
. 也许吧 KeyCode.Space
就像API显示的那样。
另外,为了进一步说明这里的问题,一旦你将代码切换到使用 KeyCode.Space
,按 Space
锁定光标,然后尝试按 Escape
. 同样你会看到它似乎是解锁的,直到你按下 Left Mouse Button
在游戏窗口中再次出现。这是因为游戏认为你已经不在游戏窗口中了,一旦你按了 Escape
.
希望能帮到你