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

MAU*_*UT 1 c# unity-game-engine

预制层级:

纽扣

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));
Run Code Online (Sandbox Code Playgroud)

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

请帮忙。

谢谢!

zwc*_*oud 5

原因

GetComponentInChildren 还将返回gameObject本身的组件。

public Component GetComponentInChildren(Type t);
Run Code Online (Sandbox Code Playgroud)

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

解决方案

  1. 如果子GameObject 1 Text和的索引2 Image是固定的。您可以通过Transform.GetChild(index)

    var buttonTransform = addTypeButton.transform;
    var text = buttonTransform.GetChild(0);
    var image = buttonTransform.GetChild(1);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果顺序不固定,请使用Transform.Find(childName)

    var buttonTransform = addTypeButton.transform;
    var text = buttonTransform.Find("1 Text");
    var image = buttonTransform.Find("2 Image");
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最安全的解决方案:

    将您的预制件拖到场景并将脚本附加到Button GameObject

    using UnityEngine;
    using UnityEngine.UI;
    public class MyButton : MonoBehaviour
    {
        public Text text;
        public Image image;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后将1 Text和拖动2 Imagetextimage在按钮检查器中的字段中。 怎么样
    请记住按“应用”按钮并将Ctrl+S其保存到预制件中。

    这样,您可以访问文本和图像,例如:

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