【问题标题】:Why can't I get the Text component of an Input Field为什么我无法获取输入字段的文本组件
【发布时间】:2022-01-16 13:01:51
【问题描述】:

我有一个 TextMeshPro 输入字段,但我在获取 Text 组件的各种尝试都产生了空引用异常。输入字段称为名称。当玩家在提交姓名后单击“确定”时,我会引用此对象。 这是 GetName 脚本:

public class GetName : MonoBehaviour
{
    GameObject Name;

    // These two are left over from previous attempts.
    public TextMeshProUGUI player_name;
    public TMP_InputField player_inputField;

    private string monicker;

    // Integer function should be less bother than a bool when called from another script.

    public int IsNameEmpty()
    {
        monicker = Name.GetComponent<TMP_InputField>().text.ToString();

    // Program never gets this far.

另一个脚本中的OK函数是:

public class WelcomeButtons : MonoBehaviour
{
    public GetName getName;

    void TaskOnClick6()
    {
        Debug.Log("You have clicked the OK button!");

        int isName = getName.IsNameEmpty(); // Causes null reference exception.

        // Program never gets this far.

【问题讨论】:

  • 嗨佩扎。由于我没有看到您的代码中设置了您的游戏对象名称,您确定您引用了包含 TMP_InputField 的游戏对象吗?另一方面,如果您将 GetName-Component 附加到包含 TMP_InputField 的 GameObject,则可以更改“Name.GetComponent().text.ToString();”到“GetComponent().text.ToString();”。
  • 感谢您的回复。 GetName 脚本附加到一个名为 NameControl 的空 GameObject。是否应该将其附加到输入字段?

标签: c# unity3d nullreferenceexception


【解决方案1】:

从输入框获取文本的简单方法

public class GetName: MonoBehaviour
{
public TMP_InputField name;

public void TaskOnClick()
{
    if(name =="")
    {
     Debug.log("NO Name Found");
    }
    else
    {
    Debug.log("NAME: "+name);
    }
}

【讨论】:

  • 使用 OK 按钮的 OnClick() 方法?
  • 给 OK 函数使用 TaskOnClick()
  • 感谢您的建议 JOYSON S T。只是让您知道显示的代码有误:Assets\Scripts\GetName.cs(16,13): error CS0019: Operator '=='不能应用于“TMP_InputField”和“字符串”类型的操作数。
  • 而不是""null
【解决方案2】:

是的,如果您将上述脚本附加到一个空的游戏对象,那么您的脚本缺少指向包含 TMP_InputField-Component 的游戏对象的链接。您可以通过两种简单的方式解决此问题,只需确定最适合您的方式即可:

a) 将 GetName 脚本附加到同样包含 TMP_InputField-Component 的 GameObject。替换行“Name.GetComponent().text.ToString();”使用“GetComponent().text.ToString();”。

b) 将 GetName 脚本留在空的 GameObject 上。制作“游戏对象名称;”通过将其更改为“公共游戏对象名称”来公开行。转到 Unity 编辑器。选择包含getName-script的GameObject时,您应该在Inspector中看到名称属性和它旁边的空字段。将包含 TMP_InputField-Component 的 GameObject 拖放到其中。

那么,为什么您的代码以前不起作用?好吧,GetName 脚本需要某种对您的 TMP_InputField 组件的引用,而该组件丢失了。您尝试从 Name-Property 中获取它,但从未为其分配任何值。

【讨论】:

  • 你是对的。感谢您的帮助。
【解决方案3】:

感谢我收到的所有建议。我现在有一个使用 OnClick() 方法的工作版本:

public class GetName : MonoBehaviour
{
    public TMP_InputField user_inputField;      // User-entered name.

    public void SaveName()
    {
        Globals.player = user_inputField.text.ToString(); // Saved for later.
        Debug.Log("Globals.player is " + Globals.player);
    }

    public void ResetName()
    {
        user_inputField.text = "";
        Globals.player = "";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多