Unity中如何在Start方法内访问并赋值TMP_Text组件
解决方案
方式1:全局查找对应名称的游戏对象获取组件
直接通过GameObject.Find()全局匹配场景内和你要找的文本组件所在游戏对象同名的物体,再获取TMP_Text组件即可。需要提前确认场景里的文本游戏对象名称和你查找时填的名称完全一致(大小写敏感)。
using UnityEngine; using TMPro; // 必须引入TMPro命名空间 public class Timer : MonoBehaviour { public TMP_Text p1Name; public TMP_Text p2Name; public TMP_Text p1Score; public TMP_Text p2Score; private void Start() { // 引号内替换为你场景里对应文本组件所在的游戏对象的实际名称 p1Name = GameObject.Find("p1Name文本对象名").GetComponent<TMP_Text>(); p2Name = GameObject.Find("p2Name文本对象名").GetComponent<TMP_Text>(); p1Score = GameObject.Find("p1Score文本对象名").GetComponent<TMP_Text>(); p2Score = GameObject.Find("p2Score文本对象名").GetComponent<TMP_Text>(); } }
方式2:从指定父物体下查找(更推荐)
全局查找性能开销更高,也可能误找到其他场景里重名的对象。如果你的几个TMP_Text都放在同一个UI父物体下,建议从父物体层级开始查找,精准度和性能都更好。
示例代码(假设所有文本的父物体名为ScoreBoard,且这个父物体是当前脚本挂载对象的子物体):
using UnityEngine; using TMPro; public class Timer : MonoBehaviour { public TMP_Text p1Name; public TMP_Text p2Name; public TMP_Text p1Score; public TMP_Text p2Score; private void Start() { // 先拿到父物体的Transform Transform scoreBoard = transform.Find("ScoreBoard"); // 从父物体下查找对应名称的子对象,获取组件 p1Name = scoreBoard.Find("p1Name").GetComponent<TMP_Text>(); p2Name = scoreBoard.Find("p2Name").GetComponent<TMP_Text>(); p1Score = scoreBoard.Find("p1Score").GetComponent<TMP_Text>(); p2Score = scoreBoard.Find("p2Score").GetComponent<TMP_Text>(); } }
额外优化建议
可以增加空值判断,避免名称拼写错误导致空引用报错:
var p1NameObj = GameObject.Find("p1Name"); if (p1NameObj != null) { p1Name = p1NameObj.GetComponent<TMP_Text>(); } else { Debug.LogError("未找到名称为p1Name的游戏对象,请检查名称拼写"); }
如果你的文本对象名称和变量名完全一致,还可以用反射批量赋值,减少重复代码,适合需要赋值的文本数量更多的场景。
内容的提问来源于stack exchange,提问作者Slurpee Sauce
相关产品推荐
相关产品推荐

