2017-04-06 31 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