using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ItemSpawner : MonoBehaviour
{
public GameObject itemPrefab; // Префаб предмета
public string itemTag = "SpecialItem"; // Тег предмета
public Vector3[] spawnPoints; // Массив координат для спавна
public float checkInterval = 30f; // Время между проверками (в секундах)
private Dictionary spawnHistory; // Словарь для хранения времени последнего спавна на каждой точке
void Start()
{
spawnHistory = new Dictionary(); // Инициализация словаря
StartCoroutine(SpawnItems()); // Запуск корутины для спавна предметов
}
IEnumerator SpawnItems()
{
while (true) // Бесконечный цикл
{
foreach (var point in spawnPoints) // Проход по всем точкам спавна
{
// Проверка, прошел ли интервал с момента последнего спавна на этой точке
if (!spawnHistory.ContainsKey(point) || Time.time - spawnHistory[point] > checkInterval)
{
// Проверка, есть ли предметы с заданным тегом на этой точке
if (!IsItemWithTagAtPosition(point))
{
SpawnItem(point); // Спавн предмета
spawnHistory[point] = Time.time; // Запись времени спавна
}
}
}
yield return new WaitForSeconds(checkInterval); // Ожидание до следующей проверки
}
}
void SpawnItem(Vector3 position)
{
Instantiate(itemPrefab, position, Quaternion.identity); // Создание (спавн) предмета в заданной позиции
}
bool IsItemWithTagAtPosition(Vector3 position)
{
Collider[] colliders = Physics.OverlapSphere(position, 0.1f); // Получение всех коллайдеров в радиусе 0.1 от позиции
foreach (var collider in colliders) // Проверка каждого коллайдера
{
if (collider.CompareTag(itemTag)) // Если тег совпадает
{
return true; // Возвращаем true, если нашли предмет с заданным тегом
}
}
return false; // Возвращаем false, если предметов с заданным тегом нет
}
}
Объяснение кода
Переменные:
itemPrefab: Префаб предмета, который будет спавниться.
itemTag: Тег предмета, по которому будет происходить проверка.
spawnPoints: Массив координат, на которых могут спавниться предметы.
checkInterval: Интервал времени между проверками и спавном (в секундах).
spawnHistory: Словарь для хранения времени последнего спавна на каждой точке.
Метод Start:
Инициализирует словарь spawnHistory.
Запускает корутину SpawnItems.
Метод SpawnItems:
Проходит по всем точкам спавна из массива spawnPoints.
Проверяет, прошло ли 30 секунд с момента последнего спавна на данной точке.
Проверяет, есть ли предмет с заданным тегом на данной точке.
Спавнит предмет и обновляет время спавна в словаре spawnHistory.
Метод SpawnItem:
Спавнит предмет на указанной позиции.
Метод IsItemWithTagAtPosition:
Проверяет, есть ли предмет с заданным тегом на указанной позиции, используя Physics.OverlapSphere.
Этот скрипт нужно прикрепить к пустому объекту на сцене. Убедитесь, что массив spawnPoints заполнен координатами для спавна, а в поле itemPrefab назначен префаб спавнящегося предмета.
Заранее спасибо