Ошибка "Cannot implicitly convert type 'UnityEngine.UI.Text[]' to 'UnityEngine.UI.Text'" при добавлении в Text[] через цикл GetComponent<Text>()>

Рейтинг: 0Ответов: 2Опубликовано: 23.06.2023

Есть массив объектов с текстом, который надо редактировать несколько раз, поэтому решил сохранить в массив Text[] (пробовал и через List<Text>), но выдает ошибку: "Cannot implicitly convert type 'UnityEngine.UI.Text[]' to 'UnityEngine.UI.Text'". Подскажете в чем проблема? (Через [SerializeField] конечно работает, но хотелось бы кодом).

[SerializeField] private GameObject[] plates;
private Text[] textPlate;
for(int i = 0; i < plates.Length; i++) textPlate[i] = plates[i].GetComponent<Text>();

Ответы

▲ 0Принят

Похоже, что ты не инициализировал массив textPlate. Когда ты создаёшь массив, ты должен указать его размер. Кроме того, код должен быть в методе или функции. В данном случае, это может быть метод Start() или Awake():

[SerializeField] private GameObject[] plates;
private Text[] textPlate;

void Start() {
    textPlate = new Text[plates.Length];
    for(int i = 0; i < plates.Length; i++) textPlate[i] = plates[i].GetComponent<Text>();
}

Вызывать GetComponent<Text>() для GameObject не всегда будет возвращать компонент Text, если на GameObject не настроен такой компонент. Если ты уверен, что каждый GameObject имеет компонент Text, тогда код должен работать. В противном случае, добавь проверку на null.

Также, убедись, что используешь пространство имен UnityEngine.UI для класса Text.

using UnityEngine;
using UnityEngine.UI;
▲ 0
internal sealed class UpdateText
{
    [SerializeField] private Text[] _texts;

    private void Awake()
    {
        for (int iterator = 0; iterator < _texts.Length; iterator++)
            _texts[iterator].text = $"{iterator}";
    }
}

Рекомендую воспользоваться не GameObject а сразу компонентом Text. Так мы избавимся от лишних итераций попытки получения компонентов, копирования и аллоцирование лишних объемов памяти, для хранения ссылок.