Установить текстовое значение объекта Text game на определенную клавишу при ее нажатии (Unity)

#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;
                    }

                }
                }
            }