Каков самый чистый / эффективный способ ссылки на дочерний GameObject? Через захват или просто поиск по имени / тегу? - PullRequest
0 голосов
/ 07 октября 2019

Я думал о том, что будет лучшим, более чистым и эффективным способом ссылки на ребенка моего объекта в моем сценарии. Я имею в виду, у меня есть GameObject с именем Player, и у него есть пистолет. Я знаю, что он всегда будет держать это, и мне нужно иметь это в переменной, чтобы сделать некоторые вещи. У меня есть что-то вроде:

myGun.shoot ();

И у меня есть 2 способа получить объект myGun.

1-й: сделав публичный myGun и захватить егоскрипт. 2-й: путем поиска ссылки с помощью findObjectWithTag или аналогичных средств.

Какой из них является наилучшим и почему?

1 Ответ

3 голосов
/ 07 октября 2019

Для штатных компонентов

Как по мне, лучшая практика в этом случае это создание поля со ссылкой. Почему?

  1. Если вы будете использовать теги - в какой-то момент будет создано множество тегов, и при управлении ими будет легко создавать ошибку
  2. Если вы будете использовать поиск по имени -Через некоторое время вы обнаружите огромные проблемы с обновлением вашей иерархии. Например, в будущем вы будете удалять / переименовывать дочерние элементы - вы будете знать, когда именно скрипт выдаст исключение нулевой ссылки.
  3. Если вы используете поля - вы всегда знаете, когда и как используется каждый дочерний элемент. Также это очень хорошая практика, когда вы работаете в команде - вам не нужно описывать членам команды, как взаимодействовать с вашим кодом.
  4. Если вы используете поля - вы можете создать понятный контроллер со скрытыми полями, чтобы избежать редактирования детьмиПрямой обход в обход контроллера (скрыть ссылки на детей с помощью [SerializeField]).

Для небольших компонентов

Для небольших компонентов также рекомендуется выполнять поиск по компонентам. Например, если у вас есть таймер пользовательского интерфейса, созданный с 1 текстовой меткой и 2-3 объектами GameObject, - проще найти текстовое поле с помощью gameobject.GetComponentInChild<Text>();.

Для динамически создаваемых компонентов

В этомНа всякий случай лучше создать поле со ссылкой на корневой объект и во время выполнения управлять ссылками на динамически создаваемые дочерние объекты. Например, создайте

[SerializeField] private GameObject _leftWeaponRoot;
[SerializeField] private GameObject _rigthtWeaponRoot;

и добавляйте оружие как детей во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...