如何从 instantiated/cloned 游戏对象获取 TextMeshProUGUI 组件?

How to get a TextMeshProUGUI component from an instantiated/cloned gameobject?

层次结构中的图片:

我实例化了 SlateUGUI 预制件,然后尝试访问 highlitged 游戏object 'TextDebug' 使用:

 TextMeshProUGUI text1 = SlateInstant.transform.Find("TextDebug").GetComponent<TextMeshProUGUI>();
 text1.text = "This works";

但是,它不起作用: 错误:NullReferenceException:Object 引用未设置为 object

的实例

我对使用GetComponentInChildren<>()有点怀疑,因为从层次结构可以看出它是相当多的children和sub-children。

来自Transform.Find API

Note: Find does not perform a recursive descend down a Transform hierarchy.

这意味着:它只找到第一层 childs!

您需要提供从第一个直接 child 开始的完整路径,例如

TextMeshProUGUI text1 = SlateInstant.transform.Find("Scroll View/Viewport/Content/GridLayout1/Column2/TextDebug").GetComponent<TextMeshProUGUI>();
text1.text = "This works";

更好的方法是在预制件的最顶部 parent(根)放置一个特定的控制器组件,并且有一个字段,例如

public class SlateController : MonoBehaviour
{
    public TextMeshProUGUI TextDebug;
}

并在预制件编辑模式下将 TextDebug object 拖放到检查器中的那个插槽中。

然后简单地使用例如

SlateInstant.GetComponent<TheControllerClass>().TextDebug.text = "XYZ";

我认为一个简单的解决方案是向实例化对象添加一个标签,然后使用 FindWithTag