如何在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
相关产品推荐
相关产品推荐

