Поскольку вы говорите, что сам объект Panel
также имеет компонент Image
, вы не хотите использовать GetComponentInChildren
, поскольку он также возвращает любой Image
, присоединенный к самому newObj
!
Ваш код не выдает исключение, а присваивает mySprite
компоненту Image
объекта Panel
, а не его дочерним элементам с именем Image
.
Вы должны будете использовать, например,
newObj.transform.GetChild(0).GetComponent<Image>()
или, как уже упоминалось, создать свой собственный класс и присоединить его к префабу, например,
public class TileController : Monobehaviour
{
// Reference these via the Inspector in the prefab
[SerializeField] private Text _text;
[SerializeField] private Image _image;
public void Initialize(Sprite sprite, String text)
{
_image.sprite = sprite;
_text.text = text;
}
}
, а затем выполнить
// using the correct type here makes sure you can only reference a GameObject
// that actually HAS the required component attached
[SerializeField] private TileController _prefab;
public void Populate()
{
TileController newObj;
for (int i = 0; i < 20; i++)
{
// no cast needed since Instantiate returns the type of the prefab anyway
newObj = Instantiate(_prefab, transform);
newObj.Initialize(mySprite, "test" + i);
}
}