【问题标题】:How to stop repeated letter entry in TMP input field when key held down in Unity在Unity中按住键时如何停止在TMP输入字段中重复输入字母
【发布时间】:2021-11-03 10:04:48
【问题描述】:

我正在使用 TMP 输入字段并希望覆盖一些默认行为。具体来说,当一个字母被按住时,它会重复。同样,当按下退格(或删除)时,它会删除多个字符。

我希望这样,如果一个字母被按住,该字母只输入一次。我还希望退格键仅在按住时删除一个字符。

我已经在实现Input.GetKeyDown() 来执行某项任务,所以我相信我需要在这里做类似的事情,但我不知道如何做。

谢谢。


编辑:

感谢@daniel-m。这有时有效,但有时它允许 1 或 2 个重复字母。

我添加了额外的 Debug.Logs 进行调查,如下所示:

private void Update()
    {
        if (IsFieldSelected)
        {
            // if a key is pressed
            if (Input.anyKeyDown)
            {
                // save the the current text to lastText (this key will have been entered)
                lastText = inputField.text;
                Debug.Log("Key was pressed! inputField = " + inputField.text + ", inputField = " + lastText);
            }

            // if a key is held down
            if (Input.anyKey)
            {
                Debug.Log("Key held down, part 1! inputField = " + inputField.text + ", inputField = " + lastText);
                inputField.text = lastText;
                Debug.Log("Key held down, part 2! inputField = " + inputField.text + ", inputField = " + lastText);
            }
        }
    }

我用以下 Keydown 和 Keyup 时间戳(记录在不同的脚本中)连续按住键 1 到 6:

文本框中的输出是 1122334456。您可以在下面的调试日志中看到向 inputField.text 添加了重复。但是,它并不总是出现在输入字段中 - 数字 1-4 重复但 5 和 6 没有。当数字确实重复时,它们不会出现在输入字段中,直到释放键(即使调试日志显示它已经存在)。

【问题讨论】:

  • Specifically, when a letter is held down, it repeats. Similarly, when backspace (or delete) is held down, it removes multiple characters.这与您的输入设备有关..这是任何程序中任何PC键盘的正常行为

标签: c# unity3d input-field textmeshpro


【解决方案1】:

我已经进行了一些测试,我认为我有一个解决您问题的方法。
当一个键被按下时,我将当前文本保存到lastText。如果按住某个键,我将输入字段内的当前文本设置为lastText。所以代码基本上将文本字段设置为最后保存的文本。

public class Text : MonoBehaviour
{
    public TMP_InputField inputField;
    private bool IsFieldSelected;
    private string lastText;

    private void Update()
    {
        if (IsFieldSelected)
        {
            if (Input.anyKeyDown)
            {
                lastText = inputField.text;
            }

            if (Input.anyKey)
            {
                Debug.Log(inputField.text);
                inputField.text = lastText;
            }
        }
    }

    public void IsSelected()
    {
        IsFieldSelected = true;
    }

    public void IsNotSelected()
    {
        IsFieldSelected = false;
    }
}

这些是InputField (TMP) 游戏对象中的事件。

【讨论】:

  • 谢谢丹尼尔,我认为这行得通,但我已经用我发现的一个问题编辑了我的答案。 (很抱歉延迟测试您的建议,非常感谢您提供解决方案!)
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 2014-06-24
  • 2019-01-28
  • 2013-06-01
  • 2011-10-25
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
相关资源
最近更新 更多