2017-04-09 16 views
1

預製層次:在Unity中,如何使用腳本訪問預製件的兒童組件?

按鈕

1文本

2圖像

我希望訪問預製的圖像子組件。

我嘗試以下的代碼:

GameObject addTypeButton = (GameObject)Instantiate(prefabButton); 
addTypeButton.transform.SetParent(ParentPanel, false); 
//set text 
addTypeButton.GetComponentInChildren<Text>().text ="Some string"; 
//get image 
WWW www = new WWW("someImagelink"); 
yield return www; 
//set image 
addTypeButton.GetComponentInChildren<Image>().sprite = Sprite.Create(www.texture, new Rect(0, 0, www.texture.width,www.texture.height), new Vector2(0, 0)); 

然而,上述代碼被訪問按鈕(內置)的圖像的腳本。 不是圖像UI組件。 如何訪問UI圖像(子)組件?

請幫忙。

謝謝!

回答

3

原因

GetComponentInChildren也將在遊戲對象本身返回組件。

public Component GetComponentInChildren(Type t); 

返回遊戲對象或任何使用深度優先搜索其子類型類型的組成部分。

解決方案

  1. 如果孩子游戲物體1 Text2 Image的指標是固定的。你可以通過Transform.GetChild(index)得到它們。

    var buttonTransform = addTypeButton.transform; 
    var text = buttonTransform.GetChild(0); 
    var image = buttonTransform.GetChild(1); 
    
  2. 如果訂單不固定,請使用Transform.Find(childName)

    var buttonTransform = addTypeButton.transform; 
    var text = buttonTransform.Find("1 Text"); 
    var image = buttonTransform.Find("2 Image"); 
    
  3. 最安全解決方案:

    拖動預製到現場,並附加一個腳本到您的按鈕GameObject

    using UnityEngine; 
    using UnityEngine.UI; 
    public class MyButton : MonoBehaviour 
    { 
        public Text text; 
        public Image image; 
    } 
    

    然後拖動1 Text2 Imagetextimage場Button的檢查員。 how
    請記住按下應用按鈕和Ctrl + S將其保存到您的預製中。

    通過這種方式,您可以訪問,如文本和圖像:

    var mybutton = addTypeButton.GetComponent<MyButton>(); 
    mybutton.text.text = "Some string"; 
    mybutton.image.sprite = Sprite.Create(...); 
    
+0

3個答案,但只有這一個才能真正完成這項工作。 'GetChild'比'Find'好。 – Programmer

+0

我想補充一點,依賴對象名稱或層次結構順序可能並不總是最安全的解決方案。對於更強大的一個,你可以使用'GetComponentsInChildren ()'並檢查返回_Image_s是否與你按鈕上的不同(不過這會比較慢)。 – Kardux

-1

嘗試改變

addTypeButton.GetComponentInChildren<Image>().sprite = Sprite.Create(www.texture, new Rect(0, 0, www.texture.width,www.texture.height), new Vector2(0, 0));

addTypeButton.GetComponent<Image>().sprite = Sprite.Create(www.texture, new Rect(0, 0, www.texture.width,www.texture.height), new Vector2(0, 0));