Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите создать скрипт для C# (unity)

Ярослав Гладких Ученик (124), на голосовании 3 месяца назад
нужно что бы предметы (со спец. тегом) спавнились на определённых координатах при условии то что на их месте не будет предметов с таким-же тегом в течении 30 секунд

Заранее спасибо
Голосование за лучший ответ
GGG Просветленный (31821) 4 месяца назад
 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 назначен префаб спавнящегося предмета.
Ярослав ГладкихУченик (124) 4 месяца назад
можно как то разъяснить
GGG Просветленный (31821) Ярослав Гладких, Готово
Ярослав ГладкихУченик (124) 4 месяца назад
public float timeSpawn = 2f

что значит этот "2f"?
GGG Просветленный (31821) Ярослав Гладких, В языке программирования C#, суффикс f используется для обозначения числа с плавающей точкой одинарной точности (типа float). Когда вы пишете 2f, это означает, что число 2 является значением типа float, а не значением типа double, которое является типом данных с плавающей точкой двойной точности. В C# литералы с плавающей точкой по умолчанию имеют тип double, поэтому для явного указания типа float используется суффикс f.
 public float timeSpawn = 2f; // 2f обозначает число 2.0 типа float 
 
Sergio 2.1 Оракул (63885) 4 месяца назад
Убедитесь, что вы правильно настроили теги для ваших предметов в Unity.

Создайте пустой объект в Unity и добавьте к нему новый скрипт (например, назовите его ItemSpawner).

Скопируйте и вставьте следующий код в скрипт:
 using System.Collections; 
using UnityEngine;

public class ItemSpawner : MonoBehaviour
{
public GameObject itemPrefab; // Префаб для спавна предметов.
public string itemTag = "Item"; // Наименование тэга предметов.
public Vector3[] spawnPoints; // Координаты для спавна предметов.
public float spawnInterval = 30f; // Интервал спавна (в секундах).

private void Start()
{
// Начинаем Coroutine для спавна предметов.
StartCoroutine(SpawnItems());
}

private IEnumerator SpawnItems()
{
while (true)
{
foreach (Vector3 spawnPoint in spawnPoints)
{
// Проверяем наличие предмета в точке спавна.
Collider[] colliders = Physics.OverlapSphere(spawnPoint, 0.1f);
bool hasItem = false;

foreach (Collider collider in colliders)
{
if (collider.CompareTag(itemTag))
{
hasItem = true;
break;
}
}

// Если на точке нет предмета, спавним новый предмет.
if (!hasItem)
{
Instantiate(itemPrefab, spawnPoint, Quaternion.identity);
}
}

// Ждем перед следующим спавном.
yield return new WaitForSeconds(spawnInterval);
}
}
}
Похожие вопросы