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