Чтобы создать игровой объект к коде скрипта используется команда Instantiate, которая создает копию игрового объекта на сцене (аналогично команде «Duplicate» в редакторе). Эту копию в дальнейшем мы можем настраивать как нам нужно прямо в коде скрипта.
Команду Instantiate часто используют в связке с префабом. Например, реализация стрельбы в игре, когда снаряды должны появляться на сцене только в момент нажатия игроком определенной клавиши.
Сначала создается шаблон игрового объекта (префаб снаряда) и полностью настраивается его поведение – его перемещение, уничтожение, взаимодействие с другими объектами и т.д.
Затем в скрипте при условии нажатия клавиши, создается копия (экземпляр) префаба в нужной позиции на сцене. Для упрощения коды мы будем создавать префаб снаряда в центре космического корабля.
В строке 7 создается публичная переменная для связи с префабом. Подробнее про переменные и их использование можно прочитать в статье https://dzen.ru/a/ZdLo9tHxawyW7tHU
Данная переменная имеет тип GameObject, то есть является игровым объектом. Имя переменной – Bullet, по этому имени мы и будем обращаться к этой переменной. Переменная имеет модификатор public, а значит она появится как отдельное поле в компоненте скрипта в редакторе Unity. В этом поле мы укажем заранее подготовленный префаб снаряда.
В строке 16 проверяется нажатие клавиши «пробел», и в строке 18 с помощью команды Instantiate создается экземпляр снаряда. После создания игровой объект снаряда работает согласно своим настройкам и скриптам. В этой статье мы не будем разбирать настройки префаба снаряда, этот материал можно изучить на примере реализации игры «Ruby's Adventure».
У команды Instantiate есть несколько деклараций (вариантов использования). В зависимости от того, нужно ли создать просто копию объекта, или копию объекта в определенной позиции, можно использовать нужный вариант декларации.
- - public static Object Instantiate (Object original);
создает точную копию объекта original и возвращает ее для дальнейшего использования.
- - public static Object Instantiate (Object original, Transform parent);
создает копию объекта original, делает его дочерним к объекту parent и возвращает ее для дальнейшего использования.
public static Object Instantiate (Object original, Transform parent, bool instantiateInWorldSpace);
создает копию объекта original, делает его дочерним к объекту parent и возвращает ее для дальнейшего использования. Если нужно разместить новый объект в системе всей игровой сцены, то задайте последний параметр равным true. Если требуется установить положение объекта относительно его нового родителя, то задайте последний параметр равным false.
- - public static Object Instantiate (Object original, Vector3 position, Quaternion rotation);
создает копию объекта original в позиции position с углом поворота rotation, а затем возвращает е для дальнейшего использования.
- public static Object Instantiate (Object original, Vector3 position, Quaternion rotation, Transform parent);
создает копию объекта original в позиции position с углом поворота rotation, делает его дочерним к объекту parent, а затем возвращает е для дальнейшего использования.
Что значит «создает и возвращает»? Команда Instantiate создает копию игрового объекта, которую мы можем сохранить в переменной типа GameObject, с которой затем можно работать, а значит изменять свойства этого созданного экземпляра прямо в скрипте. В данном случае скорость и направление снаряда при выстреле нужно изменять сразу после создания этого снаряда.
Пусть в скрипте снаряда у нас определены методы для задания скорости и направления.
Тогда при создании экземпляра можно сразу же задать ему скорость и направление, совпадающее с направлением космического корабля.
В 18 строке мы не просто создаем экземпляр снаряда, но и сохраняем его в переменной bullet. Обратите внимание, что переменные Bullet и bullet это две абсолютно разные переменные, поскольку первая буква у них написана в разном регистре. Bullet – это префаб снаряда, по образу которого мы создаем множество снарядов. А bullet – это конкретный снаряд, который создается при нажатии клавиши стрельбы. Несмотря не то, что снарядов можно создать очень много, мы можем использовать одно и то же имя переменной, так как оно используется только настройки только что созданного снаряда.
Подробнее про переменные и их использование можно прочитать в статье https://dzen.ru/a/ZdLo9tHxawyW7tHU
Теперь можно использовать эту переменную для того, чтобы через связанный скрипт задать скорость и направление снаряду, что реализовано в строках 19 и 20 соответственно.
Для уничтожения игрового объекта в коде скрипта существует команда Destroy(). Команду можно использовать для:
- уничтожения игрового объекта сразу же при выполнении команды;
- отложенного уничтожения игрового объекта через указанный промежуток времени.
Рассмотрим уничтожение объекта на примере снаряда. В скрипте снаряда в методе Start() уже используется эта команда для уничтожения снаряда через 10 секунд после его создания. Если снаряд никуда не попадает, то он улетает и продолжает существовать за пределами сцены, пока игра не будет закрыта. Данная команда позволяет уничтожить снаряд, который никуда не попал через 10 секунд. Таким образом мы избавляемся от большого числа игровых объектов, которые находятся на сцене, используют «ресурсы игры», но уже не участвуют в игровом процессе.