Unity 3D: Автогенерация врагов (машин) в игре

Подготовка сцены

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

Создайте новый C# скрипт AutoCarCreate. Разместите его на префабе ангара (дома). Добавьте компонент AutoCarCreate к префабу, установив его изначально в неактивное состояние. Компонент активируется после размещения ангара на карте, то есть после удаления скрипта PlaceObjects с объекта.

Добавьте к префабу ангара дочерний объект – пустую игровую сущность, точку генерации автомобилей. Назовите её SpawnPoint, установите координаты (0, 0, 0) и переместите в нужное место на префабе.

Скрипт AutoCarCreate

В скрипте AutoCarCreate создайте поля:

  • public GameObject carPrefab: префаб автомобиля.
  • public float time: интервал времени (в секундах) между генерацией автомобилей (по умолчанию 5 секунд).

Метод Start запускает корутину SpawnCar:

using System.Collections;
using UnityEngine;

public class AutoCarCreate : MonoBehaviour
{
    public GameObject carPrefab;
    public float time;
    [NonSerialized] public bool isEnemy = false;

    void Start()
    {
        StartCoroutine(SpawnCar());
    }

    IEnumerator SpawnCar()
    {
        for (int i = 1; i <= 3; i++)
        {
            yield return new WaitForSeconds(time);
            GameObject car = Instantiate(carPrefab, transform.GetChild(0).position, Quaternion.identity);
            if (isEnemy)
            {
                car.tag = "Enemy";
            }
        }
    }
}

Обратите внимание на подключение модуля System.Collections. Корутина использует цикл for, создающий три автомобиля. yield return new WaitForSeconds(time) обеспечивает задержку между созданием. Instantiate(carPrefab, transform.GetChild(0).position, Quaternion.identity) создаёт экземпляр автомобиля в позиции SpawnPoint с вращением по умолчанию.

Модификация скрипта PlaceObjects

В скрипте PlaceObjects добавьте логику для активации AutoCarCreate при удалении PlaceObjects:

// ... другой код скрипта PlaceObjects ...

void OnDestroy()
{
    GetComponent<AutoCarCreate>().enabled = true;
}

При размещении ангара, скрипт PlaceObjects удаляется, и AutoCarCreate активируется, начиная генерацию автомобилей.

Случайное расположение автомобилей

Измените скрипт AutoCarCreate, добавив случайное смещение позиции генерации:

// ... другой код скрипта AutoCarCreate ...

IEnumerator SpawnCar()
{
    for (int i = 1; i <= 3; i++)
    {
        yield return new WaitForSeconds(time);
        Vector3 position = transform.GetChild(0).position;
        position.x += Random.Range(3f, 7f);
        position.z += Random.Range(3f, 7f);
        GameObject car = Instantiate(carPrefab, position, Quaternion.identity);
        if (isEnemy)
        {
            car.tag = "Enemy";
        }
    }
}

Автомобили будут генерироваться в случайных позициях в небольшом радиусе от SpawnPoint.

Генерация вражеских автомобилей

Создайте пустой объект EnemySpawnPoints. Добавьте к нему дочерние объекты – точки генерации вражеских ангаров.

Скрипт GenerateEnemy

Создайте скрипт GenerateEnemy и разместите его на основной камере. В нём:

  • Массив public Transform[] points для хранения точек генерации ангаров.
  • Поле public GameObject factoryPrefab для префаба вражеского ангара.
  • В методе Start запустите корутину SpawnFactory.
using System.Collections;
using UnityEngine;

public class GenerateEnemy : MonoBehaviour
{
    public Transform[] points;
    public GameObject factoryPrefab;
    public float spawnTime = 10f; // Время между спавном фабрик

    void Start()
    {
        StartCoroutine(SpawnFactory());
    }

    IEnumerator SpawnFactory()
    {
        for (int i = 0; i < points.Length; i++)
        {
            yield return new WaitForSeconds(spawnTime);
            GameObject spawn = Instantiate(factoryPrefab, points[i].position, Quaternion.Euler(0, Random.Range(0, 360), 0));
            Destroy(spawn.GetComponent<PlaceObjects>());
            spawn.GetComponent<AutoCarCreate>().enabled = true;
            spawn.GetComponent<AutoCarCreate>().isEnemy = true;
        }
    }
}

Корутина SpawnFactory перебирает точки генерации и создаёт вражеские ангары. После создания ангара удаляется компонент PlaceObjects, активируется AutoCarCreate, и устанавливается isEnemy в true.

Тег Enemy и модификация SelectController

Создайте в Unity тег Enemy. Модифицируйте скрипт SelectController, чтобы игрок не мог выбирать вражеские автомобили:

// ... другой код скрипта SelectController ...

for (int i = 0; i < colliders.Length; i++)
{
    if (colliders[i].gameObject.CompareTag("Enemy"))
    {
        continue;
    }
    selectedObjects.Add(colliders[i].gameObject);
}

Теперь в игре реализована автоматическая генерация дружественных и вражеских автомобилей. Вражеские автомобили помечены тегом Enemy и не могут быть выбраны игроком. В следующих уроках будет реализовано взаимодействие между автомобилями.

Что будем искать? Например,программа