You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity C#中通过脚本生成TMP_InputField?

脚本创建TMP_InputField的完整方案

TMP_InputField不像Image、TMP_Text那样是单一组件就能正常工作的,它需要配套的子对象(背景、占位文本、输入文本框),并且要把这些子对象的组件正确关联到TMP_InputField的属性中,才能正常使用。以下是完整的创建代码:

using UnityEngine;
using TMPro;

public class CreateInputField : MonoBehaviour
{
    public Canvas targetCanvas; // 可在Inspector指定目标Canvas,或直接挂载到Canvas对象上

    void Start()
    {
        // 1. 创建输入框主对象并添加核心组件
        GameObject inputFieldObj = new GameObject("CustomTMPInputField");
        inputFieldObj.transform.SetParent(targetCanvas.transform, false);
        TMP_InputField inputField = inputFieldObj.AddComponent<TMP_InputField>();

        // 2. 设置主对象的RectTransform,调整显示位置和大小
        RectTransform inputRect = inputFieldObj.GetComponent<RectTransform>();
        inputRect.anchorMin = new Vector2(0.5f, 0.5f);
        inputRect.anchorMax = new Vector2(0.5f, 0.5f);
        inputRect.pivot = new Vector2(0.5f, 0.5f);
        inputRect.sizeDelta = new Vector2(300, 40); // 输入框宽300,高40
        inputRect.anchoredPosition = Vector2.zero; // 居中显示

        // 3. 创建背景子对象(输入框底色)
        GameObject backgroundObj = new GameObject("Background");
        backgroundObj.transform.SetParent(inputFieldObj.transform, false);
        Image backgroundImg = backgroundObj.AddComponent<Image>();
        backgroundImg.color = new Color(0.9f, 0.9f, 0.9f); // 默认浅灰色背景

        // 让背景铺满整个输入框
        RectTransform bgRect = backgroundObj.GetComponent<RectTransform>();
        bgRect.anchorMin = Vector2.zero;
        bgRect.anchorMax = Vector2.one;
        bgRect.sizeDelta = Vector2.zero;
        bgRect.anchoredPosition = Vector2.zero;

        // 4. 创建占位文本子对象(输入为空时的提示)
        GameObject placeholderObj = new GameObject("Placeholder");
        placeholderObj.transform.SetParent(inputFieldObj.transform, false);
        TMP_Text placeholderText = placeholderObj.AddComponent<TMP_Text>();
        placeholderText.text = "请输入内容...";
        placeholderText.color = Color.gray;
        placeholderText.fontSize = 16;

        // 设置占位文本的布局,左对齐并留内边距
        RectTransform placeholderRect = placeholderObj.GetComponent<RectTransform>();
        placeholderRect.anchorMin = Vector2.zero;
        placeholderRect.anchorMax = Vector2.one;
        placeholderRect.sizeDelta = Vector2.zero;
        placeholderRect.anchoredPosition = Vector2.zero;
        placeholderText.alignment = TextAlignmentOptions.MidlineLeft;
        placeholderText.margin = new Vector4(10, 0, 0, 0); // 左内边距10

        // 5. 创建输入文本子对象(用户输入内容的显示载体)
        GameObject textObj = new GameObject("Text");
        textObj.transform.SetParent(inputFieldObj.transform, false);
        TMP_Text inputText = textObj.AddComponent<TMP_Text>();
        inputText.text = "";
        inputText.color = Color.black;
        inputText.fontSize = 16;

        // 设置输入文本的布局,和占位文本一致
        RectTransform textRect = textObj.GetComponent<RectTransform>();
        textRect.anchorMin = Vector2.zero;
        textRect.anchorMax = Vector2.one;
        textRect.sizeDelta = Vector2.zero;
        textRect.anchoredPosition = Vector2.zero;
        inputText.alignment = TextAlignmentOptions.MidlineLeft;
        inputText.margin = new Vector4(10, 0, 0, 0);

        // 6. 关联TMP_InputField的关键引用,这一步是核心
        inputField.textComponent = inputText;
        inputField.placeholder = placeholderText;
        inputField.image = backgroundImg;

        // 可选:设置输入框的额外属性
        inputField.characterLimit = 20; // 限制输入字符数
        inputField.contentType = TMP_InputField.ContentType.Standard; // 输入类型为标准文本
    }
}

关键说明

  • 主对象挂载到Canvas时,SetParent的第二个参数传false,可以避免父对象的RectTransform设置覆盖自身的布局。
  • 必须将textComponent、placeholder、image三个属性正确关联,否则输入框无法正常显示内容或状态。
  • 可以根据需求修改各个对象的颜色、大小、字体等属性,替换背景Image的Sprite也能实现自定义外观。

内容的提问来源于stack exchange,提问作者ZoKi Mo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:32:09