Приветствую начинающих разработчиков! В данной статье мы научимся спавнить объекты на игровой сцене на примере 2D игры. Хотя он подойдёт и для 3д, но с минимальными изменениями в коде. Долго затягивать не будем, а приступим сразу к делу.
Для начала с помощью окна Hierarchy создадим пустой игровой объект(Create Empty), и назовём его SpawnArea. Этот объект будет являться нашим спавнером. Так же создайте префаб того объекта, который будет спавниться. Я создал свой префаб на основе обычного круглого 2д объекта (2D Object - Sprites - Circle). Назвал данный префаб Circle.
Спавнер вместе с префабом готов! Но чтобы этот спавнер работал, необходимо написать скрипт. С помощью окна Project создадим C# скрипт с названием Spawner, и заранее присвойте его нашему объекту с названием SpawnArea. В скрипт пропишите следующие строчки кода:
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject enemyPrefab;
public float timeSpawn = 2f;
private float timer;
private void Start()
{
timer = timeSpawn;
}
private void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
timer = timeSpawn;
Instantiate(enemyPrefab, transform);
}
}
}
Давайте вкратце разберём код:
- В строке #5 мы создали переменную enemyPrefab, в которой будет храниться ссылка на наш префаб, который будет спавниться.
- В строках #7-8 мы создали две переменные отвечающие за время. В переменной timeSpawn хранится информация о том, сколько необходимо времени, для создания объекта на сцене. А в timer будет хранится сам таймер, по истечении которого будет создаваться объект на игровой сцене. Чуть позже вы поймёте разницу.
- В методе Start() мы в переменную timer заносим значение из timeSpawn.
- В методе Update() мы каждый кадр уменьшаем время нашего таймера timer, и как только оно закончится, то значение timer обновляется, а на игровой сцене, с помощью метода Instantiate() создаётся новый объект.
И в завершении необходимо настроить наш скрипт в окне Inspector:
- В поле Enemy Prefab перетащите префаб Вашего объекта Circle.
- В поле Time Spawn укажите время спавна для таймера. Я указал значение 2.
Готово! На этом этапе можете запустить свой проект, и убедиться, что всё работает успешно! Каждые 2 секунды происходит создание нового игрового объекта.
Спавнер созданный выше хорошо работает, но предлагаю его немного усовершенствовать, поскольку мне не нравятся в нём две вещи. Во-первых, все объекты создаются в одной точке, а хотелось бы, чтобы они создавались в случайной области в пределах определённого радиуса. А во-вторых, хотелось бы, чтобы создание объектов не производилось в тех случаях, когда в игре уже присутствует 10 объектов.
Предлагаю чуть чуть переписать наш код следующим образом:
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject enemyPrefab;
public int maxEnemy = 5;
public float timeSpawn = 2f;
private float timer;
public float distance = 3;
private void Start()
{
timer = timeSpawn;
}
private void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
timer = timeSpawn;
if (transform.childCount < maxEnemy)
{
Instantiate(enemyPrefab, Random.insideUnitCircle * distance, Quaternion.identity, transform);
}
}
}
}
Что же мы тут добавили? В строке #6 мы добавили переменную maxEnemy, которая отвечает за максимальное количество созданных объектов на игровой сцене. А в строке #11 в переменной distance храниться множитель для нашего радиуса спавнера, в пределах которого будут создаваться объекты. А сам радиус прописывается в строке #26 через Random.insideUnitCircle.
В строке #24 с помощью свойства childCount мы проверяем, сколько у нас имеется созданных объектов. И если их число меньше 10, то происходит создание нового объекта, иначе - ничего не делать.
Наш скрипт готов! Теперь запустим его, и увидим следующую картину. Каждые 2 секунды в нашем проекте создаётся по одному объекту, в случайной точке, радиусом в 3, от нашего спавнера. И как только было создано 10 объектов, спавнер прекращает свою работу.
Но и этот спавн можно усовершенствовать. Мы можем спавнить не один и тот же объект, а разные объекты, которые будут спавниться случайным образом. Но это уже совсем другая история. О том, как это можно реализовать, можете прочитать наш отдельный гайд, под названием «Создаём рандомный спавн объектов».
На этом наш гайд подошёл к концу. Если остались вопросы, задавайте их в комментариях. А так же не забывайте ставить свои лайки.
Спавн объектов только в точке 0*0*0.
Переделал: Instantiate(enemyPrefab, Random.insideUnitSphere * distance + transform.position, Quaternion.identity);
Но теперь бесконечный спавн