Gameobject上的Unity Update文本是从其他Gameobject的脚本启动的

时间:2017-04-06 14:39:47

标签: unity3d gameobject

我正在为HoloLens开发,我制作了一个跟随我的对象。这个Gameobject实际上是一个带有文本的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上的Text但不知道如何做到这一点。 (我可以很容易地更新第一个对象上的文本,但我想这样做)

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

1 个答案:

答案 0 :(得分:0)

要建立在Serlite评论的内容之上,您需要将GetComponent与其他脚本结合使用。

public class MyTextUpdater: MonoBehavior
{
public Text SuperText2;
}

MyTextUpdater应用于您的ObjectToTagAlong预制件(或GameObject,如果不是预制件),并在编辑器中将SuperText2的值设置为您要更新的Text对象(通常这是一个孩子) ObjectToTagAlong GameObject)。

现在,只要您想要更新实例上的Text对象,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的副本时,它会产生一个&#34;深的&#34;排序的副本,意味着副本将具有完全相同的子GameObjects结构。

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

每个孩子都使用它自己的新副本进行实例化。最重要的是,如果Original有一个指向其中一个孩子(或孙子孙等)的MonoBehavior脚本,则Copy将有一个脚本指向相应的复制子项。

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

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

Original只是一个GameObject。在编辑器中,您可以看到它有子项,但这并不代表一个类。你不能在脚本中做这样的事情:

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

以同样的方式,你不能这样做:

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

您可以创建代码来迭代GameObject的所有子节点,寻找具有正确名称的子节点(&#34; ChildB&#34;),但这样做效率低,可能编程错误。 更好的方法是创建一个脚本类,它实际上允许您将该子项作为该类中的字段进行访问。这就是MyTextUpdater脚本的用武之地。

这将无效:

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

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

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

当然假设您将MyTextUpdater脚本应用于Original并与子文本组件建立了正确的连接。