I'd like to add an event listener for changes to Cursor.lockState in my unity WebGL game.
If the cursor is locked, I would like to unpause the game. If I detect the cursor has been unlocked I'd then like to pause.
Here is what I have so far
using UnityEngine;
using System.Collections;
public class Pause : MonoBehaviour {
public RotateCamera rotateCamera;
public GameObject pauseMenu;
private bool paused;
void Update()
{
if (paused)
{
if (Input.GetMouseButtonDown(0))
{
UnpauseGame();
return;
}
}
if (Cursor.lockState == CursorLockMode.Locked)
{
Debug.Log("CursorLockMode = Locked");
UnpauseGame();
return;
}
if (Cursor.lockState == CursorLockMode.Confined)
{
Debug.Log("CursorLockMode = Confined");
UnpauseGame();
return;
}
if (Cursor.lockState == CursorLockMode.None && paused == false)
{
Debug.Log("CursorLockMode = None");
PauseGame();
}
}
public void PauseGame()
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
paused = true;
pauseMenu.SetActive(true);
}
public void UnpauseGame()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
paused = false;
pauseMenu.SetActive(false);
}
}
The problem is
- When trying to unpause the game with mouse button down the game instantly pauses itself. I believe the script detects that the cursor.lockstate is unlocked and instantly re-pauses the game.
To fix this, I think I need to create an event that listens to changes in the lock state and calls the method. Rather than the method being called every frame.
This is simple. Don't use the
Cursor
API directly. Wrap another class around it then use property getter and setter to implement a simple event system. Check out Unity's Events and Delegates tutorial here.The wrapper
AdvanceCursor.cs
:USAGE:
Simply subscribe to the events.