Unity 5.3 - 输入框无法在第一次按下"回车"键时检测到

4
我必须双击“返回”键才能提交值!两个小时前(我只需要按一次回车键)它还能正常工作,但是我重新启动了Unity之后,现在需要双击“返回”才能提交值。
更新 #2
我已经在画布上附加了一个脚本来保持输入框。代码如下:
public class Example: MonoBehaviour {
    public InputField inputField; 

    void Start () {
    }

    void Update () {
    HandleUserInput ();
    }

    void HandleUserInput() 
    {

    if (inputField.isFocused && inputField.text != "" && (Input.GetKey (KeyCode.Return) || Input.GetKey(KeyCode.KeypadEnter))) {
        Debug.Log ("Pressed");
        //Do stuff
        inputField.text = ""; //Clear Inputfield text
        inputField.ActivateInputField(); //Re-focus on the input field
        inputField.Select ();//Re-focus on the input field
    }
    }

当我在场景中玩并且在输入字段中键入并按下第一次返回时,日志不会显示任何内容,但是当我再次按下它时,它会显示“Pressed”。
更新#3
我找到了某种解决方案,如果我删除“inputField.isFocused”,那么输入字段将检测到第一个“Return”键。但是,在我的情况下,如果输入字段中有一些文本,然后用户单击场景中的任何其他位置,然后按回车键,输入字段将提交它。
请提供建议。

你使用的是哪个Unity版本?你的输入字段设置是什么?如果你能发布设置的截图就更好了。我建议你删除当前的设置,然后创建一个新的,看看是否可以解决你的问题。 - Programmer
我已经更新了问题。 - Abzax
好的,我明白你的问题。它需要按多次回车键。你想让它只按一次? - Programmer
是的,确切地说,我使用的解决方案还可以,但不是我想要的。 - Abzax
好的,请检查我的答案。 - Programmer
1
非常感谢你,伙计 :) - Abzax
3个回答

6

不需要手动操作。您需要使用事件系统来注册并接收与InputField相关的事件。通过使用 InputField.onEndEdit 注册到 InputField 提交事件,以获得在 InputField 上提交时的回调。您还可以使用 inputField.onValueChanged 来检查输入何时发生了变化。您可以在回调函数中执行null检查:

public class Example: MonoBehaviour
{
    public InputField inputField;
    void Start()
    {
    }

    void Update()
    {
    }

    //Called when Input changes
    private void inputSubmitCallBack()
    {
        Debug.Log("Input Submitted");
        inputField.text = ""; //Clear Inputfield text
        inputField.ActivateInputField(); //Re-focus on the input field
        inputField.Select();//Re-focus on the input field
    }

    //Called when Input is submitted
    private void inputChangedCallBack()
    {
        Debug.Log("Input Changed");
    }

    void OnEnable()
    {
        //Register InputField Events
        inputField.onEndEdit.AddListener(delegate { inputSubmitCallBack(); });
        inputField.onValueChanged.AddListener(delegate { inputChangedCallBack(); });
    }

    void OnDisable()
    {
        //Un-Register InputField Events
        inputField.onEndEdit.RemoveAllListeners();
        inputField.onValueChanged.RemoveAllListeners();
    }
}

出于好奇,我本可以写成 inputField.onEndEdit.AddListener(inputSubmitCallBack); 你为什么使用了 delegate {} 这种结构呢? - frankhermes
3
@frankhermes 这对于 ButtonButton.onClick.AddListener(inputSubmitCallBack))是可行的,但对于 InputField 事件来说不起作用。为了使它能够工作,inputSubmitCallBack 需要具有字符串参数。如果您尝试这样做,将会收到编译时错误。使用 delegate 您可以调用任何带参数或不带参数的函数,而不仅仅是 Unity 要求您调用带有参数的函数。我也使用 delegate 来在使用许多按钮时指定尽可能多的参数。这使我可以使用特殊的 ID,并为所有按钮使用一个回调函数。 - Programmer
对于任何在这里搜索的人来说,现在更容易的方法是只需使用 Input.GetKeyUp(KeyCode.Return)。然后,根据表单的状态执行您想要的任何操作。 - Fattie

1

解决这个问题的另一个方法是在上一帧中检查inputField.isFocused,因为按下按钮会使inputField.isFocused变为false。


1
这很简单。
void Update()
    {
        if (Input.GetKeyUp(KeyCode.Return)) { YourSubmitFunction(); }
    }

这并不简单,可以参考gopla29的答案。当按下回车键时,输入框会失去焦点。 - Scriptman
嗨@Scriptman - 嗯,当您点击“返回”时,输入字段应该失去焦点!!!您能举个例子说明您的意思吗? - Fattie
我制作了一个聊天框,并在我的Update函数中使用了以下代码:if (Input.GetKeyDown(KeyCode.Return) && inputField.isFocused) { sendMsgToServer(); } 但isFocused为false,所以我设置了自己的IsInputFocused变量。(请注意,我现在只使用Unity三天)Enter键也用于游戏中的其他事情,这就是为什么我想知道是否在聊天中按下Enter键的原因 :) - Scriptman
在任何系统上,包括iOS、Android、Unity和Web,如果您对输入字段有不寻常的需求,您将需要进行一些编程。您的第一个评论可能会让任何初学者感到困惑,因为所显示的代码是在任何普通屏幕上使用"正常"或"标准"方式在Unity中完成的,比如表单。顺便说一句,在您的情况下,您可能会发现'onValidateInput'很有用,祝好运! - Fattie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接