我正在为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启动的游戏对象上的文本?
答案 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并与子文本组件建立了正确的连接。