Cursor Lockmode only works once?

I’m having a problem where the cursor only locks itself once on the screen. I’m using visible along side it too but I stopped that but it still won’t lock itself.

Here’s my code :

public class StartUp : MonoBehaviour {

    public GameObject player;

    public bool cursorUnlocked = false;

	public float CursorLockUnlockWait = 0.5f;
	public float CursorWaitOver;

	void Start () {

        //Instantiate player In random place on terrain////////////////////////////////////////
        Vector3 position = new Vector3(Random.Range(0f, 4000f), 700f, Random.Range(0f, 4000f));
        Instantiate(player, position, transform.rotation);
		Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
        ////////////////////////////////////////////////////////////////////////////////////////
	}

    void Update()
    {
        //Cursor Lock/Unlock//////////////////////////////////////////////////////////////////////////
	    if (Input.GetKey("escape") && cursorUnlocked == false && CursorWaitOver < Time.time)
        {
            cursorUnlocked = true;
			CursorWaitOver = Time.time + CursorLockUnlockWait;

            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
        }

		if (Input.GetKeyDown("escape") && cursorUnlocked == true && CursorWaitOver < Time.time)
        {
            cursorUnlocked = false;
			CursorWaitOver = Time.time + CursorLockUnlockWait;

            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }
        /////////////////////////////////////////////////////////////////////////////////////////////
    }
}

The wait is necessary because other wise it will transition between unlocked and then locked in a blink of an eye!

Anyway hope you guys can find a solution to this and thanks for the help!

Cursor locking stuff is certainly a bit weird. I’ve made a few changes to your script and it seems to work as expected now. The wait was actually only necessary because you were using two if statements in a row instead of an ifelse if. I also changed the first if from GetKey() to GetKeyDown(). Here’s the updated script:

using UnityEngine;

public class StartUp : MonoBehaviour
{
	public GameObject player;

	public bool cursorUnlocked = false;

	void Start()
	{
		//Instantiate player In random place on terrain////////////////////////////////////////
		Vector3 position = new Vector3(Random.Range(0f, 4000f), 700f, Random.Range(0f, 4000f));
		Instantiate(player, position, transform.rotation);

		Cursor.visible = false;
		Cursor.lockState = CursorLockMode.Locked;
		////////////////////////////////////////////////////////////////////////////////////////
	}

	void Update()
	{
		//Cursor Lock/Unlock//////////////////////////////////////////////////////////////////////////
		if (Input.GetKeyDown(KeyCode.Escape) && cursorUnlocked == false)
		{
			cursorUnlocked = true;
			Cursor.visible = true;
			Cursor.lockState = CursorLockMode.None;
		}
		else if (Input.GetKeyDown(KeyCode.Escape) && cursorUnlocked == true)
		{
			cursorUnlocked = false;
			Cursor.visible = false;
			Cursor.lockState = CursorLockMode.Locked;
		}
		/////////////////////////////////////////////////////////////////////////////////////////////
	}
}

Note that there’s actually a bug in the editor that makes cursor locking not work properly. Try building your project with this script and it should work as expected.

Hope this helps!