Unity. Геттер не присваивает объекту ссылку
GameObject prefab = Instantiate(Resources.Load("UIPref/ScrollViewOfMenu") as Object, Canvas.transform) as GameObject;
GameObject Nickname = prefab.transform.Find("Nickname_text").gameObject; // Здесь ошибка !!!!
Ошибка: Ссылка на объект не задана чтобы инстанцировать (создать) этот объект. Указывает как раз таки на строку с GameObject Nickname.
В тоже время в справке по геттеру gameObject типа Transform написано о том что данный гетер возвращает: The game object this component is attached to. A component is always attached to a game object.
Вот и вопрос, почему данная строчка не работает?
// Немного позже я достиг результата следующим по сути типичным способом, однако мне интересно узнать причину того почему тот вариант выше не сработал:
// GameObject Nickname = GameObject.Find("Nickname_text");
Ответы (2 шт):
Во первых геттер не присвивает и точка. Присваивает сеттер!
Попробуй так:
GameObject Nickname = null;
Transform NicknameTransform = prefab.transform.Find("Nickname_text");
if (NicknameTransform != null)
Nickname = NicknameTransform.gameObject;
if (Nickname == null)
Debug.LogError("Nickname is null");
И угадай в чём была твоя ошибка.
Вообще Find ужасная штука и Resources тоже. В идеале всё должно быть так:
[DisallowMultipleComponent]
public class Foo : MonoBehaviour
{
// ссылка на префаб в инспекторе, Resources это не удобно и косячно
[SerializeField] private ScrollViewOfMenu _scrollMenuTemplate;
// ссылка на канвас, но в идеале сам Foo должен быть на канвасе и без всяких ссылко Instantiate на свой transform
[SerializeField] private Transform _canvas;
private ScrollViewOfMenu _scrollMenu;
private void Awake ()
{
_scrollMenu = Instantiate(_scrollMenuTemplate.gameObject, _canvas).GetComponent<ScrollViewOfMenu>();
GameObject Nickname = _scrollMenu.Nickname;
}
}
[DisallowMultipleComponent]
public class ScrollViewOfMenu : MonoBehaviour
{
// ссылка к дочернему объекту префаба задаётся в инспекторе, что бы его не искать
public GameObject Nickname;
}
И эти префабы можно переименовывать и перемещать по папкам проекта как хочешь не устраивая мусорный полигон Эко-Техно-Парк "Resources".
Не знаю почему, но помогло точное указание пути до объекта в иерархии префаба: Получается глупо то, что я использую Find, но при этом указываю точный путь до этого объекта. Почему так не известно, возможно из за того, что это префаб, так как аналогичный вариант вполне работает НЕ с префабами
Следующий вариант оказался рабочим:
GameObject Nickname = prefab.transform.Find("ScrollViewOfMainMenu/Viewport/Content/VerticalLayout/Nickname_text").gameObject;