单击时调用 class 的 Unity 错误实例。创建我自己的输入管理器。

Unity wrong instance of class is being called on click. Creating my own input manager.

我正在制作自己的 InputManager 以在游戏期间重新映射按键。

问题是我已将 class 分配给每个快捷方式的父项,当在调试器上按下按钮时,我可以看到来自另一个键的数据。 也只有这把钥匙一直在不停地变化。

这是我的例子: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() 方法的规范上。它是否并行处理每个实例? 如果是这种情况 - 是否可以在 Update() 方法之外使用 Input.anyKeyDown

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

问题正如我对 Update() 方法所想的那样。我已经使用 caroutine 修复了它。

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