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

Сначала займемся творчеством. В Unity создание объекта называется «Instantiating». Перейдите в окно «Проект» и создайте папку «Prefabs» в Assets. Это будет, возможно, самая важная папка, содержащаяся в каждом из ваших проектов Unity. Любой объект, который вы хотите создать позже в коде, должен существовать как префаб в этой папке.

Для наших целей мы просто создадим 3D-капсулу в Иерархии. Не стесняйтесь менять размер, материал, цвет или название. Как только это будет сделано, щелкните и перетащите этот объект из Hierachy в папку Prefabs, которую мы только что создали. Он стал синим! Это означает, что теперь это префаб. Теперь это постоянная форма для Unity, чтобы знать, когда вы хотите создать новую. Вам бы не хотелось создавать совершенно новый огненный шар для каждого брошенного Марио из рук.

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

Идите вперед и перетащите префаб, который вы сделали ранее, в это место. Теперь, когда скрипты знают, что это за переменная, мы можем сделать это, когда захотим. Теперь нам нужно, чтобы это произошло. Давайте добавим проверку ввода в Update().

В этом примере мы хотим, чтобы префаб создавался, когда игрок нажимал пробел. К счастью, у метода есть простое для запоминания название — Instantiate(). Поэтому поместите Instantiate() и внутри скобок то, что вы назвали переменной GameObject.

Вот и все! Если вы запустите Unity и продолжите нажимать пробел, новые клоны будут постоянно появляться в сцене и иерархии. Вы можете получить больше информации о Instantiate(), добавив еще пару аргументов.

С transform.position во-вторых, вы в основном говорите, что этот объект должен быть создан в его позиции по умолчанию. Обычно для префаба это должно быть (0,0,0). Таким образом, он просто будет отображаться как правильный объект, который создает его экземпляр, например, огненный шар Марио. Вы также можете настроить это смещением, сказав transform.position + new Vector3(1, 1, 0). Добавление любых чисел, которые вы хотите, к новому Vector3 позволит любое смещение по осям. Кватернион относится к вращению. В 99% случаев вы будете использовать Quaternion.identity, который просто сохраняет вращение по умолчанию.

Прямо сейчас, если вы продолжаете нажимать пробел, все объекты будут появляться в одном и том же пространстве и складываться в иерархию. Слишком много объектов одновременно — это не всегда хорошо, поэтому давайте научимся их уничтожать прямо сейчас. Создайте новый скрипт и поместите его на префаб. Вот настоящая красота сборных домов. Какой бы скрипт или другой компонент вы ни добавили в префаб, он будет существовать всегда, поэтому нам нужно будет сделать это только один раз.

В другом акте полезного именования метод уничтожения объекта называется Destroy(). Если вы поместите Destroy(this.gameObject) в любую функцию, Start() или другую, она уничтожит объект, на который помещен скрипт.

Однако если мы это сделаем, то объект будет уничтожен, как только мы создадим его экземпляр, и мы не сможем иметь никакого реального контроля. Конечно, вы можете поставить это под какое-то условие, что, скорее всего, будет иметь место в будущих работах, но сейчас я хочу рассмотреть другой вариант. Так же, как и метод Instantiate(), метод Destroy() также имеет опцию для дополнительных аргументов. Если вы используете Destroy(this.gameObject, 3.0f), он уничтожит объект примерно через 3 секунды. Поместите это в функцию Start() и попробуйте!

Посмотри на это! Как только вы создадите какие-то объекты, по прошествии 3 секунд они просто уничтожат себя. Благодаря этим новым знаниям вы теперь разработчик игр, способный создавать и разрушать. Хорошо себя чувствует, не так ли?