Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Гайды Мой Кабинет

Как создать спавн объектов в Unity

Приветствую начинающих разработчиков! В данной статье мы научимся спавнить объекты на игровой сцене на примере 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 объектов, спавнер прекращает свою работу.

Но и этот спавн можно усовершенствовать. Мы можем спавнить не один и тот же объект, а разные объекты, которые будут спавниться случайным образом. Но это уже совсем другая история. О том, как это можно реализовать, можете прочитать наш отдельный гайд, под названием «Создаём рандомный спавн объектов».

На этом наш гайд подошёл к концу. Если остались вопросы, задавайте их в комментариях. А так же не забывайте ставить свои лайки.

Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

1
Name_1317 11 месяц назад

Спавн объектов только в точке 0*0*0.
Переделал: Instantiate(enemyPrefab, Random.insideUnitSphere * distance + transform.position, Quaternion.identity);
Но теперь бесконечный спавн

Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь