Нужно как-то ограничить спаун.

Программирование на Юнити.

Нужно как-то ограничить спаун.

Сообщение porar57790 23 дек 2022, 17:34

Всем привет, надеюсь, что получится решить мою проблему.

Есть код со спауном объектов, работает отлично, но есть проблема. Я не могу ограничить спаун объектов.
Объекты до бесконечности спаунятся один в другом.
Есть варианты, как прекратить спаунить объект в точке, если в ней уже есть объект?
Буду благодарен любой помощи)
(Если дополнительно будут советы, как оптимизировать при помощи корутин, буду вдвойне благодарен)

using UnityEngine;

public class SpawnMaterial : MonoBehaviour
{
public GameObject[] SpawnSpot; \\ Место спауна
public GameObject[] Material; \\ Объект для спауна

private int rand;
private int randPosition;
public float StartTimeBtwSpawns;
private float timeBtwSpawns;


void Start()
{
timeBtwSpawns = StartTimeBtwSpawns;
}

void Update()
{
if (timeBtwSpawns <= 0)
{

rand = Random.Range(0, Material.Length);
randPosition = Random.Range(0, SpawnSpot.Length);
Instantiate(Material[rand], SpawnSpot[randPosition].transform.position, Quaternion.identity);
timeBtwSpawns = StartTimeBtwSpawns;
}
else
{
timeBtwSpawns -= Time.deltaTime;
}
}
}
porar57790
UNец
 
Сообщения: 5
Зарегистрирован: 21 авг 2021, 22:46

Re: Нужно как-то ограничить спаун.

Сообщение 1max1 23 дек 2022, 20:40

Проверяй сферкастом есть ли там объект, но на нем должен быть коллайдер.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Нужно как-то ограничить спаун.

Сообщение waruiyume 23 дек 2022, 20:41

Перемешать точки спавна.
Обходить по очереди.
Проверить есть ли что-то в точке https://docs.unity3d.com/ScriptReferenc ... ckBox.html
Если нет, то спавнить и выходить из цикла, если есть, то пропускать итерацию.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Нужно как-то ограничить спаун.

Сообщение porar57790 24 дек 2022, 09:56

Звучит логично, но как реализовать это в коде?
porar57790
UNец
 
Сообщения: 5
Зарегистрирован: 21 авг 2021, 22:46

Re: Нужно как-то ограничить спаун.

Сообщение 1max1 24 дек 2022, 12:31

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SpawnMaterial : MonoBehaviour
{
    public GameObject[] spawnPoints = null; // точки для появления
    public GameObject[] prefabs = null; // объекты для появления
    public float delay = 1.0f; // задержка между появлениями

    Coroutine spawnObjectsCoroutine = null;

    void Start()
    {
        if (spawnObjectsCoroutine != null)
        {
            StopCoroutine(spawnObjectsCoroutine);
        }

        spawnObjectsCoroutine = StartCoroutine(c_SpawnObjects());
    }

    IEnumerator c_SpawnObjects()
    {
        var randomPoints = new List<GameObject>(spawnPoints);

        Shuffle(randomPoints);

        for (int i = 0; i < randomPoints.Count; ++i)
        {
            Instantiate(GetRandomItem(prefabs), randomPoints[i].transform.position, Quaternion.identity);

            yield return new WaitForSeconds(delay);
        }

        spawnObjectsCoroutine = null;
    }

    void Swap<T>(List<T> me, int i, int j)
    {
        var k = me[i];
        me[i] = me[j];
        me[j] = k;
    }

    void Shuffle<T>(List<T> me)
    {
        for (int i = 0; i < me.Count - 1; ++i)
        {
            Swap(me, i, Random.Range(i + 1, me.Count));
        }
    }

    public static T GetRandomItem<T>(T[] me)
    {
        return me[Random.Range(0, me.Length)];
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7