Как я могу получить ссылку на игровой объект в сцене из сборного - PullRequest
1 голос
/ 20 апреля 2019

В настоящее время я работаю над системой Оборудования, которая будет Инстанцировать игровые объекты на сцену из списка, до этого я не использовал систему Инстанции, просто постоянно поддерживая Активные Игровые Объекты на сцене.

Теперь, когда я создаю игровой объект (Prefab), я сталкиваюсь с ошибкой «Потерять ссылки», когда я их создаю, я просматривал различные другие статьи, такие как это обсуждение здесь:

Однако я смотрю на альтернативные способы, помимо использования тегов, поскольку эта система может использовать большое количество тегов, снижающих производительность игры с течением времени. Кто-нибудь знает другие способы сохранения ссылок со сцены в сборный домик?

Так как это новая система, я на самом деле просто ищу предложения о том, как сохранить ссылки игровых объектов сцены в префаб, поскольку моя старая система просто удерживала игровые объекты активными на сцене, а не создавала их экземпляры. еще раз, я хотел бы услышать различные типы методов, нечто большее, чем просто использование тегов.

Ссылки, которые я пытаюсь сохранить, - это три элемента Transform из сценария, прикрепленного к моему префабу, они следующие

    public Transform camPos;
    public Transform aimLocation;
    public Transform crosshairLocation;

В настоящее время я просто перетаскиваю игровые объекты со сцены в общедоступные поля в скрипте

Поскольку это будет основная система, я бы не хотел использовать теги для этой системы. Но это определенно допустимая опция. Я просто ищу другие методы для сохранения ссылок игровых объектов сцены в префаб При создании префаба на сцену,

Спасибо, что нашли время, чтобы прочитать, и любые предложения будут высоко оценены!

Любые вопросы, просто задавайте!

1 Ответ

1 голос
/ 20 апреля 2019

Вы можете , а не сохранять ссылки на сцены в префабах по очевидным причинам (что произойдет, если вы создадите этот префаб в другой сцене?). Ваш префаб должен обнаружить объекты, в которых он нуждается после его создания. Я не большой поклонник системы тегов в Unity (или любой другой системе, которая использует строки в качестве идентификаторов, слишком много места для ошибок). Я бы порекомендовал вам использовать любой из этих трех подходов:

  1. Создайте нужные вам преобразования (поз. Камера, местоположение прицеливания и т. Д.), Если когда-либо будет только один из них. Вы создадите класс сценария специально для каждого, сделаете этот класс синглтоном и поместите его в игровые объекты. Затем, после создания вашего префаба, вы можете сделать что-то вроде этого: camPos = CamPos.Instance.transform; Вы можете прочитать о единственном образце здесь .

  2. Если их будет более одного, сгруппируйте все связанные объекты в одну иерархию (то есть сделайте их всех дочерними по отношению к одному игровому объекту). Например, если будет много персонажей, и у каждого будет отдельное целевое местоположение, вы можете сделать целевое местоположение дочерним по отношению к игровому объекту персонажа. Затем в своем префабе (позаботьтесь о том, чтобы префаб также стал дочерним элементом того же корневого игрового объекта), вы можете сделать что-то по следующему принципу: camPos = transform.root.GetComponentInChildren<CamPos>().transform; Еще лучше, вы можете иметь компонент, имеющий ссылки на все такие объекты. и прикрепите один к корневому игровому объекту. Затем вы можете сделать: camPos = transform.root.GetComponent<ReferenceRepository>().CamPos;

  3. Инициализировать префабы, когда они будут созданы. Например, скажем, у вас есть класс игрока, который создает оружие и уже имеет ссылку на camPos. Вы можете сделать это следующим образом: var weapon = Instantiate<Weapon>(myWeaponPrefab); weapon.CamPos = camPos; Обратите внимание, что когда вы назначаете публичные поля таким образом, они будут доступны только после вызова Start. Другими словами, они не будут доступны в Awake.

Тем не менее, я не думаю, что делать такие вещи, как прицельное и перекрестное расположение отдельных объектов, в любом случае очень хорошая идея. У вас должен быть класс player / human / pawn, и этот класс может предоставлять эту информацию другим объектам, которые в ней нуждаются.

...