Unity неправильный экземпляр класса вызывается по клику. Создание моего собственного менеджера ввода.

Я делаю свой собственный InputManager для переназначения ключей во время игры.

Проблема в том, что я назначил класс каждому из родительских ярлыков, и когда на отладчике нажата кнопка, я вижу данные с другой клавиши. И только этот ключ постоянно меняется снова и снова.

Вот мой пример: Up - родитель кнопки, UpS - нажатие кнопки, которая вызывает метод из своего родителя. У каждого родителя-ребенка он установлен так же, как и там. Иерархия с инспектором - присвоение ключа введите описание изображения здесь

На нажатие кнопки я звоню

public void ToggleChangeButtonPannel(Button button)
{
    this.ActionText.text = Description;
    this.CurrentKeyText.text = Name;

    if (Panel.enabled)
    {
        Panel.enabled = false;
    }
    else
    {
        Panel.enabled = true;
    }
}

И при обновлении я проверяю, видна ли панель. Я думаю, что проблема может быть со спецификацией метода Update(). Работает ли он на каждом экземпляре параллельно? Если это так - возможно ли использовать Input.anyKeyDown вне метода Update()?

private void Update()
{
    if (!Panel.enabled)
    {
        return;
    }
    if (Input.anyKeyDown)
    {
        var currentKey = Key;
        try
        {
            var newKey = (KeyCode)System.Enum.Parse(typeof(KeyCode), Input.inputString.ToUpper());

            if (Shortcuts.TryChangeKeyCode(currentKey, newKey))
            {
                RenameButtons(newKey);
            }
            else
            {
                //Error message handling
            }
        }
        catch
        {
            //Error message handling
        }
    }
}

1 ответ

Решение

Проблема была, как я и думал, с помощью метода Update(). Я исправил это с помощью карутин.

public void ToggleChangeButtonPannel(Button button)
{
    ActionText.text = Description;
    CurrentKeyText.text = Name;

    if (Panel.enabled)
    {
        Panel.enabled = false;
    }
    else
    {
        Panel.enabled = true;
        StartCoroutine(KeyRoutine());
    }
    EventSystem.current.SetSelectedGameObject(null);
}


IEnumerator KeyRoutine()
{
    while (!Panel.enabled || !Input.anyKeyDown)
    {
        yield return null;
    }
    try
    {
        var newKey = (KeyCode)System.Enum.Parse(typeof(KeyCode), Input.inputString.ToUpper());
        if (Shortcuts.TryChangeKeyCode(Key, newKey))
        {
            RenameButtons(newKey);
            Key = newKey;
            Panel.enabled = false;
        }
        else
        {
             StartCoroutine(RemoveAfterSeconds(3, Panel));
        }
    }
    catch
    {
        StartCoroutine(RemoveAfterSeconds(3, Panel));
    }
}
Другие вопросы по тегам