#c# #unity3d
#c# #unity-игровой движок
Вопрос:
У меня есть две кнопки, и у каждой кнопки есть объект Text game, который является дочерним по отношению к нему. При нажатии кнопки и последующем нажатии клавиши я хочу обновить текст, отображаемый объектом Text game, который является дочерним объектом, на ту кнопку, которая была нажата. Вот что я пробовал:
void OnGUI()
{
Event currentEvent = Event.current;
if (currentEvent.isKey)
{
if (currentEvent.keyCode.ToString() != "None")
{
keyboardEvent = currentEvent;
key = keyboardEvent.keyCode.ToString();
}
}
}
public void changeFirstKey()
{
if (keyboardEvent.isKey)
{
firstKeyText.text = key;
}
}
public void changeSecondKey()
{
if (keyboardEvent.isKey)
{
secondKeyText.text = key;
}
}
Вызывается первая кнопка firstKey
и вызывается вторая secondKey
. Я убедился, что при firstKey
нажатии он вызывает changeFirstKey
и наоборот для secondKey
. Однако отображаемый текст не меняется. Он выдает ошибку в консоли каждый раз, когда я пытаюсь нажать на одну из кнопок, и проблема в том, что keyboardEvent
не установлен экземпляр объекта. Я убедился, что это keyboardEvent
глобальная переменная, чтобы я мог получить к ней доступ за пределами OnGUI
, но я все еще получаю эту ошибку. Что я делаю не так?
Комментарии:
1. Вы пробовали использовать отладчик и ставить точку останова внутри
OnGUI
, чтобы увидеть, когда она нажата и что происходит?2. @UnholySheep Если вы хотите проверить значение
keyboardEvent
илиkey
, я это сделал.keyboardEvent.keyCode.ToString()
возвращает нажатую мной клавишу, но только когда я вызываю ее внутриOnGUI
(и то же самое дляkey
).3. Судя по показанному коду, похоже, что OnGUI не вызывался. Если вы протестируете KeyboardEvent в обеих функциях изменения на null перед использованием .IsKey, вы увидите, что KeyboardEvent не был установлен.
4. @Displayname когда я тестирую
keyboardEvent
вOnGUI
, оно не равно null. Когда я тестирую это в любой из функций изменения, это. ОднакоkeyboardEvent
это общедоступная переменная, которую я объявил внеOnGUI
, поэтому я не уверен, почему это происходит.5. Поскольку в C # нет глобальных значений, я предполагаю, что вы используете что-то вроде этого статического класса, который имеет статический член. общедоступный статический класс MyValues { общедоступное статическое событие currentEvent { получить; установить} }
Ответ №1:
Попробуйте одно из этих:
- Использование заглавных букв в коде ключа:
keyboardEvent.KeyCode.ToString()
-
Попробуйте отладить ‘currentEvent’, чтобы увидеть результат
Отладка.Журнал (currentEvent)
-
Прочитайте этот пост руководства по Unity здесь
Ответ №2:
Ваш changeFirstKey changeSecondKey — это правильный метод Button? Как будет выполнено, если
(KeyboardEvent.IsKey)(); Когда вы нажимаете кнопку?
Это один из способов реализации, при котором вы должны прикрепить этот скрипт к кнопкам.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class MyTestClass : MonoBehaviour,IPointerExitHandler,IPointerDownHandler
{
bool _isFirstButtonPressed = false;
bool _isSecondButtonPressed = false;
Event keyboardEvent = new Event();
public Text firstKeyText;
public Text secondKeyText;
private string key;
public Button _button;
public void OnPointerDown(PointerEventData eventData)
{
if (eventData.selectedObject.name == "FirstButton")
{
_isFirstButtonPressed = true;
}
if (this.gameObject.name == "SecondButton")
{
_isSecondButtonPressed = true;
}
}
public void OnPointerExit(PointerEventData eventData)
{
if (this.gameObject.name == "FirstButton")
{
_isFirstButtonPressed = false;
}
if (this.gameObject.name == "SecondButton")
{
_isSecondButtonPressed = false;
}
}
void OnGUI()
{
Event currentEvent = Event.current;
if (currentEvent.isKey)
{
if (currentEvent.keyCode.ToString() != "None")
{
keyboardEvent = currentEvent;
key = keyboardEvent.keyCode.ToString();
if (_isFirstButtonPressed) {
firstKeyText.text = key;
}
if (_isSecondButtonPressed)
{
secondKeyText.text = key;
}
}
}
}