2017-04-06 85 views
0

我正在为HoloLens开发,并且制作了一个跟随我的对象。这个Gameobject实际上是一个带有文本的UI画布,我这样设置是因为我想保留原始对象。 (在MS例子只是想):沿就好Unity更新Gameobject上从其他Gameobject的脚本发起的文本

/// <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文本,但不知道如何做到这一点。 (我可以很容易地更新第一个对象上的文本,但我想这样做)

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

+0

你知道'GetComponent()'方法吗?这听起来像你所需要的,除非你实际上试图做一些事情,而不是在实例化的GameObject上修改一个'Text'组件。 – Serlite

+0

嗯,那实际上能够过滤一个特定的文本? 例如,如果我有一个称为超文本文本框2 我可以说 文本SuperText2 <<(然后分配在Unity的对象) 文本newUpdatedText = gameObject.GetComponent(typeof运算(SuperText2))作为SuperText2; 然后newUpdatedText.Text =“新文本” – Tvt

+3

呃...如果你的组件是'SuperText2'类型,那么你可能可以做到这一点 - 如果你包含你的屏幕截图,对象层次结构,并指出您想要修改的内容。 – Serlite

回答

0

要建立在Serlite评论的基础上,您需要结合其他脚本使用GetComponent

public class MyTextUpdater: MonoBehavior 
{ 
public Text SuperText2; 
} 

应用MyTextUpdater您ObjectToTagAlong预制(或GameObject如果不是预制),并在编辑器中,SuperText2的值设置为要更新(通常这是ObjectToTagAlong游戏对象的子文本对象)。

现在,只要你想更新您的实例文本对象,instantiatedObjectToTagAlong,你可以这样做:

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

编辑: 当团结实例化一个游戏对象的副本,它使“深“各种副本,这意味着副本将具有完全相同的儿童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.ChildB.Text = "Hello World!"; 

,你不能做到这一点:

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

您可以创建代码,通过游戏对象的所有子迭代寻找一个正确名称(“ChildB”)的孩子,但这是低效的,可能是糟糕的编程。 更好的方法是创建一个脚本类,它实际上可以让您访问该孩子作为该类中的一个字段。而这其中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脚本原件及作出子文本组件正确连接。

+0

但是,这不会像更新ObjectToTagAlong上的文本一样; ?这似乎并没有更新随后的对象上的文本。 – Tvt

+0

如果做得对,则不行。如果文本(为字段“SuperText2' 设置文本)是ObjectToTagAlong,当你'Instantiate'新副本,实例将所有的引用更新为你指向新的文本,现在的孩子的孩子实例,instantiatedObjectToTagAlong。 – avariant

+0

对不起,迟到的回应我直到现在都无法处理这个问题,我不明白为什么我需要另外一个类,我不能直接获取文本组件我设置新的对象的类?因为更新原始文本将不起作用,所以即使我把它放在另一个类中,它也不会更新新的对象 下面是一个结构看起来如何的图像http:/ /imgur.com/a/3QkSH也许可以帮助我设置上面的脚本,并且想要更新文本,其中instantiatedObjectToTagAlong是WarningCanvas – Tvt