在Unity中,如何使用脚本访问预制件的子组件?

时间:2017-04-09 15:37:24

标签: c# unity3d

预制层次结构:

  

按钮

     
    

1文字

         

2图片

  

我希望访问预制件的Image子组件。

我尝试了以下代码:

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));

但是,上面的代码正在访问Button的图像脚本(内置)。 不是Image UI组件。 如何访问UI Image(子)组件?

请帮忙。

谢谢!

3 个答案:

答案 0 :(得分:4)

原因

Transform.GetChild(index)也将返回gameObject本身的组件。

public Component GetComponentInChildren(Type t);
     

使用深度优先搜索返回GameObject 中的Type type 或其任何子项的组件。

解决方案

  1. 如果儿童GameObject 1 Text2 Image的索引是固定的。您可以通过Transform.Find(childName)获取它们。

    var buttonTransform = addTypeButton.transform;
    var text = buttonTransform.GetChild(0);
    var image = buttonTransform.GetChild(1);
    
  2. 如果订单未解决,请使用0.11

    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 Image拖到Button的检查器中的textimage字段。 how
    请记住按应用按钮和 Ctrl + S 将其保存到预制件中。

    通过这种方式,您可以访问文本和图像,如:

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

答案 1 :(得分:0)

在访问子对象之前,请确保在实例化之前启用或禁用子对象,然后在prefab中启用该子对象。 就像我的情况一样,我有一个带有文本子对象的UI Text游戏对象。我在预制中禁用了它,希望在实例化后通过脚本中的引用来启用它。仅当我在预制中保持启用image(child)组件时,它才起作用。

答案 2 :(得分:-1)

尝试更改

Function csvRangeNew(myRange As Range) Dim csvRangeOutput Dim entry As Variant set myRange = intersect(myRange , myRange.parent.usedrange) For Each entry In myRange If Not IsEmpty(entry.Value) Then If entry.Value = "New" Then If Not IsEmpty(Worksheets("wholelist").Range("A" & entry.Row)) Then csvRangeOutput = csvRangeOutput & Worksheets("wholelist").Range("A" & entry.Row).Value & "," End If End If End If Next csvRangeNew = Left(csvRangeOutput, Len(csvRangeOutput) - 1) End Function

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