从其他游戏对象的脚本启动的游戏对象上的统一更新文本

Unity Update Text on Gameobject initiated from script from other Gameobject

我正在为 HoloLens 开发,我制作了一个可以跟随我四处走动的物体。这个游戏对象实际上是一个 UI Canvas 里面有文本,我这样设置是因为我也想保留原始对象。 (就像在 MS 示例中一样):

 /// <summary>
/// The object to tag along set in the unity editor
/// </summary>
public GameObject ObjectToTagAlong;

/// <summary>
/// The instantiated object to tag along that follows you around.
/// </summary>
private GameObject instantiatedObjectToTagAlong;

 this.instantiatedObjectToTagAlong = GameObject.Instantiate(this.ObjectToTagAlong);

这个 instantiatedObject 标签很好,但现在我想更新 instantiatedObjectToTagAlong 上的文本,但不知道如何执行此操作。 (我可以很容易地更新第一个对象上的文本,但我想这样做)

有谁知道如何更新从另一个游戏对象启动的游戏对象上的文本?

要建立在 Serlite 评论的基础上,您需要将 GetComponent 与另一个脚本结合使用。

public class MyTextUpdater: MonoBehavior
{
public Text SuperText2;
}

MyTextUpdater 应用到您的 ObjectToTagAlong 预制件(或者 GameObject 如果不是预制件),然后在编辑器中将 SuperText2 的值设置为您要更新的文本 object (通常这是 ObjectToTagAlong GameObject 的 child)。

现在任何时候你想在你的实例上更新文本object,instantiatedObjectToTagAlong,你可以这样做:

MyTextUpdater text = instantiatedObjectToTagAlong.GetComponent<MyTextUpdate>();
if (text!=NULL && text.SuperText2!=NULL) { /*do whatever you need to do on the text.SuperText2 object*/ }

编辑: 当 Unity 实例化一个 GameObject 的副本时,它会创建一个 "deep" 排序副本,这意味着该副本将具有与 child 个游戏对象完全相同的结构。

Original                                Copy
- Child A                               - Child A (copy)
- Child B              Instanitate =>   - Child B (copy)
- - Grandchild A                        - - Grandchild A (copy)

每个 child 都用它自己的新副本实例化。最重要的是,如果 Original 有一个指向其中一个 children(或 grandchildren 等)的 MonoBehavior 脚本,Copy 将有一个指向适当 的脚本已复制 child.

MyTextUpdater [Original]                 MyTextUpdater [Copy]
- SuperText2 = Child B           =>       - SuperText2 = Child B (copy)

关于为什么会有额外脚本(MyTextUpdater脚本)的问题:

原来只是一个GameObject。在编辑器中你可以看到它有children,但这并不代表class。你不能在脚本中做这样的事情:

Original.ChildB.Text = "Hello World!";

同理,你不能这样做:

Copy.ChildB.Text = "Hello Copy World!";

您可以创建代码来遍历 GameObject 的所有 children 以寻找具有正确名称 ("ChildB") 的 child,但这效率低下而且可能很糟糕编程。 更好的方法是创建一个脚本 class,它实际上允许您访问 child 作为 class 中的一个字段。这就是 MyTextUpdater 脚本的用武之地。

这将是无效的:

GameObject Copy = Instantiate(Original);
Copy.SuperText2.Text = "Some text here";

Copy 没有名为 SuperText2、ChildB 或任何您称之为的字段或方法。但你可以这样做:

GameObject Copy = Instantiate(Original);
MyTextUpdater mtu = Copy.GetComponent<MyTextUpdater>();
mtu.SuperText2.Text = "Some text here";

当然假设您将 MyTextUpdater 脚本应用于 Original 并正确连接到 child 文本组件。