Подготовка сцены
Удалите два автомобиля, присутствующих в игре по умолчанию. После запуска игры автомобили отсутствовать будут, и пользователь сможет создавать ангары (домики), из которых будут автоматически появляться машинки. С этими машинками можно будет взаимодействовать так же, как и с автомобилями, присутствовавшими ранее.
Создайте новый 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 и не могут быть выбраны игроком. В следующих уроках будет реализовано взаимодействие между автомобилями.