前言

Input Field 控件是 UGUI 中的文本输入控件。在移动设备上使用时,当使用者点击到该控件时,就会弹出用于输入的键盘。

简单的范例,如下图:

unity 继承 InputField unity中inputfield_Unity


一个简单的输入框,左边有个提示 ICON,未输入任何文字时,会有默认的文字提示。

底图制作

首先制作一张带有图示的底图,如下图,大小为 400 x 50 像素,图示部分宽 48 像素。

unity 继承 InputField unity中inputfield_控件_02

创建输入框控件

  1. 点〝GameObject → UI → Input Field〞命令,就能创建一个输入框控件。创建出来的控件中包含 Placeholder 及 Text 两个子对象。Placeholder 用于显示默认的提示文本信息,而 Text 则用于显示用户输入的文本信息。
  2. unity 继承 InputField unity中inputfield_Input Field_03

  3. 将 InputField 命名为〝txtAccount〞,然后设定位置、大小及底图。
  4. unity 继承 InputField unity中inputfield_输入框_04


  5. unity 继承 InputField unity中inputfield_Input Field_05

  6. 点选 Placeholder 对象,在 Inspector 面板中会见到如下图所示:
  7. unity 继承 InputField unity中inputfield_Unity_06

  8. 在RectTransform 组件中设定文字显示与输入框的边距大小。因为底图有一个 48 像素的图示,所以 Left 要设定成 50,才不会挡住图示。然后在 Text 中设定默认的提示文字,并且指定字体、样式及大小。
  9. unity 继承 InputField unity中inputfield_unity 继承 InputField_07

  10. 当字体太大超过显示的范围时,会看不到文字,所以要特别注意。至于该用多大的字?可以在底部的 Layout Properties 中查看 Preferred Width / Height。
  11. unity 继承 InputField unity中inputfield_unity 继承 InputField_08

  12. 如上图,Arial 的 32 号字,其高度为 36 像素,上边距 7、下边距 6 所以等于 36 + 7 + 6 = 49,小于输入框的高 50,则能正常的看到文字。
  13. 点选Text 对象,除了提示的文字之外,其他设定就如同 Placeholder。

其他设定

以上步骤可以完成一个基本的输入控件,但有些时候会有特殊的要求,例如输入密码、数字等等。在 InputField 的 Inspector 面板中,可在〝Character Limit〞字段中设定输入最大的文字数限制。中文、英文、数字均按照一个字符处理。0表示不限制输入的字符数。

unity 继承 InputField unity中inputfield_控件_09


〝Line Type〞有以下几种:

unity 继承 InputField unity中inputfield_Unity_10


〝Single Line〞单行显示,最基本的。〝Multi Line Submit〞只能输入到右边界后自动换行,无法用〝按下【Enter】键〞换行。想按下【Enter】键换行,那就得选择〝Multi Line Newline〞。〝Content Type〞有如下几种:

unity 继承 InputField unity中inputfield_unity 继承 InputField_11


Integer Number 及 Decimal Number 的区别是前者只能整数,而后者可以输入有小数点的数字。Alphanumeric 则可以输入字母及数字。若设定为 Name,则第一个字自动转成大写。Password 会以〝*〞取代所输入的内容,包括符号。Pin 与 Password 类似,但只能输入数字。

两个事件

Input Field 有两个事件:On Value Changed 及 On End Edit,分别是当值发生改变时发出和离开编辑时发出。

unity 继承 InputField unity中inputfield_输入框_12


简单的脚本范例如下:

public InputField txtAccount;
public InputField txtPwd;

public void OnValueChanged()
{
    string szAcc = txtAccount.text.Trim();
    string szPwd = txtPwd.text.Trim();
    if( szAcc != "" && szPwd != "") {
        btnLogin.interactable = true;    
    } else {
       btnLogin.interactable = false;
    } 
}

public void OnEditEnd()
{
    string szAcc = txtAccount.text.Trim();
    Debug.Log(szAcc);
}

参考
Unity 5.X 3D 游戏开发技术详解与典型案例
作者:吴亚峰、索依娜