MicroProger
@MicroProger
Работает - не трогай

Как переместить курсор мыши по середине экрана?

Всем привет! Обрыл весь инет. Для игры мне необходимо, чтобы курсор при запуске игры перемещался в середину экрана(То есть в Start()). В общем, кода особо нет, но если поделитесь советами, я буду оооочень рад
  • Вопрос задан
  • 1630 просмотров
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Задачу можно решить минимум тремя способами. Какой способ использовать - выбирайте сами.

Способ 1
В классе Cursor наличествует свойство lockState, определяющее поведение и видимость курсора. Сохранив в него значение CursorLockMode.Locked, вы переместите курсор в центр ОКНА ИГРЫ и скроете. Затем туда нужно сохранить значение Cursor.lockState = CursorLockMode.None, что разблокирует курсор и сделает видимым. Есть только одна проблема - эта операция работает не мгновенно, потому применить их последовательно не получится. Выглядеть код будет как-то так

using UnityEngine;

public class MouseCenteringExample : MonoBehaviour {

	private void Start() {
		Cursor.lockState = CursorLockMode.Locked;
		Invoke("UnlockCursor", 0.05f);
	}

	private void UnlockCursor() => Cursor.lockState = CursorLockMode.None;	

}


Способ 2
Если вы используете New Input System, то вам доступна опция InputState.Change, которую, в контексте вашей задачи, можно использовать так:

using UnityEngine;

public class MouseCenteringExample : MonoBehaviour {

	private void Start() {
		var center = Screen.safeArea.center;
		Mouse.current.WarpCursorPosition(center);
		InputState.Change(Mouse.current.position, center);
	}

}


Способ 3
Можно воспользоваться поддержкой нативных библиотек ОС. Правда, тут придётся подключить платформозависимую компиляцию. Например, для Windows:

using System.Runtime.InteropServices;
using UnityEngine;

public class MouseCenteringExample : MonoBehaviour {

#if UNITY_STANDALONE_WIN

	[DllImport("user32.dll")]
	static extern bool SetCursorPos(int X, int Y);

	private void Start() {
		var center = Screen.safeArea.center;
		SetCursorPos((int)center.x, (int)center.y);
	}

#endif

}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Лочите в центре, а потом освобождаете.

https://docs.unity3d.com/ScriptReference/Cursor-lo...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы