C# 我锁定光标有问题(Unity)?
以下代码仅在按下Escape键后左键单击鼠标时锁定光标。有人能给我一个克服这个问题的方法吗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;
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自行处理之前,您可能需要拦截按键