Страница 1 из 1

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

СообщениеДобавлено: 23 дек 2022, 17:34
porar57790
Всем привет, надеюсь, что получится решить мою проблему.

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

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;
}
}
}

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

СообщениеДобавлено: 23 дек 2022, 20:40
1max1
Проверяй сферкастом есть ли там объект, но на нем должен быть коллайдер.

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

СообщениеДобавлено: 23 дек 2022, 20:41
waruiyume
Перемешать точки спавна.
Обходить по очереди.
Проверить есть ли что-то в точке https://docs.unity3d.com/ScriptReferenc ... ckBox.html
Если нет, то спавнить и выходить из цикла, если есть, то пропускать итерацию.

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

СообщениеДобавлено: 24 дек 2022, 09:56
porar57790
Звучит логично, но как реализовать это в коде?

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

СообщениеДобавлено: 24 дек 2022, 12:31
1max1
Синтаксис:
Используется 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)];
    }
}