Клавиша Escape для ввода с Unity3D WEB GL build
Я создал игру WEB GL. Игровое меню отображается следующим кодом:
Input.GetKeyUp(KeyCode.Escape)
Прекрасно работает в единстве и в окнах строить. В браузере аварийное нажатие перехватывается браузером, и меню не отображается.
Можно ли заставить этот код работать в сборке WEB GL? Что такое стандартная "кнопка meny" для игр WEB GL?
2 ответа
Это должно работать, потому что
Из ручного ввода WebGL в Unity: по умолчанию Unity WebGL обрабатывает все вводимые с клавиатуры вводные данные на страницу, независимо от того, имеет ли холст WebGL фокус или нет.
Может быть, вы отключили WebGLInput.captureAllKeyboardInput
(Который включен по умолчанию). В этом случае просто включите это, и оно должно работать.
Кнопка Escape по умолчанию используется для выхода из полноэкранного режима, возможно, это является причиной проблемы. Я бы предложил использовать Менеджер ввода ( https://docs.unity3d.com/Manual/class-InputManager.html) и определить кнопку, используя Escape в качестве положительной кнопки.
Как уже упоминалось @pasotee, клавиша Escape уже может быть использована. В браузере, а также в Unity Player, например, клавиша F1 используется Chrome для открытия вкладки справки. Escape определенно используется Unity Player для выхода из полноэкранного режима.
Итак, короткий ответ. Нет, ты не можешь.
Unity прослушивает все ключи по умолчанию, правда, но никогда не получает события, когда приложение верхнего уровня, такое как браузер, не отправляет его на Canvas или в исполняющую среду - иначе Unity3d Player не отправляет его на ваш код. Или в этом случае они должны исправить руководство на "[..] все кнопки, кроме горячих клавиш, связанных с Escape и браузером":
https://docs.unity3d.com/Manual/webgl-input.html
Длинный ответ таков: вы можете перехватить ключевое событие Escape внутри JavaScript и передать вызов функции в Unity Player, как упомянуто здесь:
JQuery
$(document).on('keyup',function(evt) {
if (evt.keyCode == 27) {
alert('Esc key pressed.');
}
});
Ваниль JS
var msg = document.getElementById('state-msg');
document.body.addEventListener('keypress', function(e) {
if(e.key == "Escape"){
msg.textContent += 'Escape pressed:'
}
});
https://jsfiddle.net/etcjwaf5/
И в конце вам понадобится эта информация, чтобы вызвать Unity из Javascript:
SendMessage('MyGameObject', 'MyFunction');
SendMessage('MyGameObject', 'MyFunction', 5);
SendMessage('MyGameObject', 'MyFunction', 'MyString');
https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html
И самое последнее, что у вас должен быть GameObject в загруженной сцене, который предоставляет функцию для выполнения того, что вы хотели сделать.
Имейте в виду, что если вы не отмените распространение события нажатия клавиши Escape, оно будет отправлено на UnityPlayer, который вызовет его для выхода из полноэкранного режима! И вы, возможно, не сможете предотвратить использование этого события Unity, так что помните WebGLInput.captureAllKeyboardInput
член.