单击时调用 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));
}
}
我正在制作自己的 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));
}
}