Для штатных компонентов
Как по мне, лучшая практика в этом случае это создание поля со ссылкой. Почему?
- Если вы будете использовать теги - в какой-то момент будет создано множество тегов, и при управлении ими будет легко создавать ошибку
- Если вы будете использовать поиск по имени -Через некоторое время вы обнаружите огромные проблемы с обновлением вашей иерархии. Например, в будущем вы будете удалять / переименовывать дочерние элементы - вы будете знать, когда именно скрипт выдаст исключение нулевой ссылки.
- Если вы используете поля - вы всегда знаете, когда и как используется каждый дочерний элемент. Также это очень хорошая практика, когда вы работаете в команде - вам не нужно описывать членам команды, как взаимодействовать с вашим кодом.
- Если вы используете поля - вы можете создать понятный контроллер со скрытыми полями, чтобы избежать редактирования детьмиПрямой обход в обход контроллера (скрыть ссылки на детей с помощью
[SerializeField]
).
Для небольших компонентов
Для небольших компонентов также рекомендуется выполнять поиск по компонентам. Например, если у вас есть таймер пользовательского интерфейса, созданный с 1 текстовой меткой и 2-3 объектами GameObject, - проще найти текстовое поле с помощью gameobject.GetComponentInChild<Text>();
.
Для динамически создаваемых компонентов
В этомНа всякий случай лучше создать поле со ссылкой на корневой объект и во время выполнения управлять ссылками на динамически создаваемые дочерние объекты. Например, создайте
[SerializeField] private GameObject _leftWeaponRoot;
[SerializeField] private GameObject _rigthtWeaponRoot;
и добавляйте оружие как детей во время выполнения.