C# 我锁定光标有问题(Unity)?

C# 我锁定光标有问题(Unity)?,c#,unity3d,C#,Unity3d,以下代码仅在按下Escape键后左键单击鼠标时锁定光标。有人能给我一个克服这个问题的方法吗 public class lockCursor : MonoBehaviour { public bool locked = true; // Start is called before the first frame update void Start() { Cursor.lockState = CursorLockMode.Locked;

以下代码仅在按下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;
            }
        }
    }
}

正如derHugo在其评论中提到的,您的问题在于for Cursor.lockState,其中指出:

在编辑器中,退出时光标将自动重置 按下或打开开关应用程序。在独立播放器中,您可以 完全控制鼠标光标,但切换应用程序 仍然重置光标

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

为了解决您的问题,我建议使用KeyCode.Escape以外的任何键。可能是KeyCode.Space,如API所示

另外,为了进一步说明这里的问题,一旦您将代码切换为使用KeyCode.Space,请按空格锁定光标,然后尝试按Escape。在游戏窗口中再次按下鼠标左键之前,您将再次看到它似乎处于解锁状态。这是因为游戏认为一旦按下Escape,您就不再在游戏窗口中


希望这有帮助

正如derHugo在他的评论中提到的,您的问题在于for Cursor.lockState,其中指出:

在编辑器中,退出时光标将自动重置 按下或打开开关应用程序。在独立播放器中,您可以 完全控制鼠标光标,但切换应用程序 仍然重置光标

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

为了解决您的问题,我建议使用KeyCode.Escape以外的任何键。可能是KeyCode.Space,如API所示

另外,为了进一步说明这里的问题,一旦您将代码切换为使用KeyCode.Space,请按空格锁定光标,然后尝试按Escape。在游戏窗口中再次按下鼠标左键之前,您将再次看到它似乎处于解锁状态。这是因为游戏认为一旦按下Escape,您就不再在游戏窗口中

希望这有帮助

如API中所述

在编辑器中,按下escape或切换应用程序时,光标会自动重置

由于escape本身在Unity编辑器中有一个特殊角色,因此按下它时GameView会失去焦点

这并不是一个简单的方法,因为它需要在Unity编辑器自己有机会处理转义按键之前拦截它们的按键。在传递给玩家->你的代码之前总是会发生这种情况

但是,您可以做的只是在编辑器中使用不同的键码,并仅在构建中转义,例如

#if UNITY_EDITOR
    if(Input.GetKeyDown(KeyCode.E))
#else
    if(Input.GetKeyDown(KeyCode.Escape))
#endif
    {
        ...
您可以将E替换为您希望用于仅在Unity编辑器中模拟转义键的任何其他键代码。另请参见API中所述的

在编辑器中,按下escape或切换应用程序时,光标会自动重置

由于escape本身在Unity编辑器中有一个特殊角色,因此按下它时GameView会失去焦点

这并不是一个简单的方法,因为它需要在Unity编辑器自己有机会处理转义按键之前拦截它们的按键。在传递给玩家->你的代码之前总是会发生这种情况

但是,您可以做的只是在编辑器中使用不同的键码,并仅在构建中转义,例如

#if UNITY_EDITOR
    if(Input.GetKeyDown(KeyCode.E))
#else
    if(Input.GetKeyDown(KeyCode.Escape))
#endif
    {
        ...

您可以将E替换为您希望用于仅在Unity编辑器中模拟转义键的任何其他键代码。另请参见

您的意思是按ESC键,您会看到消息,并且只有在单击光标后,光标才被实际锁定?或者你的意思是,当按下ESC键时,调试日志根本不会显示,直到你点击GameView,顺便说一句,这是设计和预期的行为,因为它允许你在没有键盘输入的情况下更改一些检查器值
因此,GameView?@derHugo会显示消息,但光标只有在单击屏幕后才会锁定。这可能与在编辑器中按下escape或切换应用程序时光标会自动重置有关?它来自API,可能意味着您设置了锁定状态,但由于ESC按钮在编辑器中具有特殊角色,它可能会立即重置锁定状态,因此您可能无法按照预期操作?嗯,您可能只为编辑器使用不同的键码,并在构建中使用escape。。除此之外,它可能会变得很棘手,因为你可能需要在Unity处理它自己之前拦截按键。你的意思是说,你按下ESC键,你会看到消息,并且只有在单击光标后,你的光标才被实际锁定?或者,你的意思是,当按下ESC键时,调试日志根本不显示,直到你点击GameView,顺便说一句,这是设计和预期的行为,因为它允许你更改一些检查器值,而不需要GameView也处理此键盘输入?@derHugo消息显示,但光标仅在单击屏幕。可能与在编辑器中按下escape或切换应用程序时光标自动重置有关?它来自API,可能意味着您设置了锁定状态,但由于ESC按钮在编辑器中具有特殊角色,它可能会立即重置锁定状态,因此您可能无法按照预期操作?嗯,您可能只为编辑器使用不同的键码,并在构建中使用escape。。除此之外,它可能会变得棘手,因为在Unity自行处理之前,您可能需要拦截按键