我有一个锁定光标的问题(Unity)?

问题描述 投票:0回答:1

以下代码只有在我按下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;
            }
        }
    }
}
c# unity3d
1个回答
2
投票

正如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编辑器中使用。(也请看 依赖平台的编译)


1
投票

正如derHugo在他的评论中提到的,你的问题就在于。API 对于 Cursor.lockState 在这里,它说:

"在编辑器中,光标在以下情况下会自动复位 escape 被按下,或在切换应用程序时。在单机版播放器中,您可以完全控制鼠标光标,但切换应用程序仍然会重置光标。"

当你去按 Escape它将你从应用程序游戏窗口中移除。这就是为什么会出现你的光标不再被锁定的情况。这也是为什么当你点击回到游戏中时,它就会进入锁定状态。同样的事情可以用你的代码来演示,启动游戏,然后切换到另一个显示器上的另一个窗口。然后把鼠标移回到游戏窗口所在的屏幕上。它会出现好像不再处于锁定状态......直到你在游戏中点击,它再次识别出光标。

为了解决你的问题,我建议你使用除以下键以外的任何键。KeyCode.Escape. 也许吧 KeyCode.Space 就像API显示的那样。

另外,为了进一步说明这里的问题,一旦你将代码切换到使用 KeyCode.Space,按 Space 锁定光标,然后尝试按 Escape. 同样你会看到它似乎是解锁的,直到你按下 Left Mouse Button 在游戏窗口中再次出现。这是因为游戏认为你已经不在游戏窗口中了,一旦你按了 Escape.

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.