Спавнер массива объектов

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

Спавнер массива объектов

Сообщение HolleWrold 20 июн 2020, 14:08

Здравствуйте. Помогите пожалуйста со следующей задачкой:
Есть 5 линий (позиций) спавна врагов. И есть 5 врагов. На линии может спавниться от 1 до 4-х врагов (дабы оставить одну свободную линию для игрока).У врагов прописано движение в сторону игрока. Если же линия занята каким-то врагом - другой враг на ней появиться в этот же момент не может. Я реализовал спавн, в котором 5 врагов спавнятся по-одному на разных позициях и не пойму, как же сделать спавн двух, трех и четырех объектов, при этом поставив за условие, что если линия занята - враг не сможет заспавниться в момент спавна другого врага.
Вот мой код:

public GameObject[] enemies; // Массив со врагами

Vector2 whereToSpawn; // Позиция спавна
float[] spawnPoints = { -1f, -0.5f, 0f, 0.5f, 1f }; // Точки спавна

private float timeBtwSpawn; //
public float spawnTime; // Время спавна

void Update()
{
if (timeBtwSpawn <= 0)
{
int rand = Random.Range(0, enemies.Length); //Рандомный выбор врага

float randomPoins = spawnPoints[Random.Range(0, spawnPoints.Length)]; // Рандомный выбор точки спавна

whereToSpawn = new Vector2(transform.position.x, randomPoins); // Рандомная позиция выбранной точки спавна

Instantiate(enemies[rand], whereToSpawn, Quaternion.identity); // Реализация всего вышеперечисленного
timeBtwSpawn = spawnTime;
}
else
{
timeBtwSpawn -= Time.deltaTime;
}
}
HolleWrold
UNец
 
Сообщения: 17
Зарегистрирован: 20 июн 2020, 12:09

Re: Спавнер массива объектов

Сообщение samana 20 июн 2020, 16:57

Вы можете перед созданием врагов - создать клон массива позиций, перемешать его (например с помощью Linq) и выбирать нужное кол-во позиций по порядку из этого клона массива позиций. Таким образом вы просто не сможете выбрать одновременно одну и ту же позицию за один проход. Конечно можно что-то и упростить или сократить, поэтому код не идеален.

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

public class Test : MonoBehaviour
{
    public GameObject[] enemies;

    Vector2 whereToSpawn;
    float[] spawnPoints = { -1f, -0.5f, 0f, 0.5f, 1f };

    private float timeBtwSpawn;
    public float spawnTime;

    public int enemiesSpawnAmount = 1; // количество появляющихся врагов

    void Update()
    {
        if (timeBtwSpawn <= 0)
        {
            // создали клон массива позиций и перемешали его
            float[] cloneSpawnPoint = spawnPoints.OrderBy(i => Random.Range(0f, 1f)).ToArray();

            // создание нужного кол-ва врагов
            for (int i = 0; i < enemiesSpawnAmount; i++)
            {
                int rand = Random.Range(0, enemies.Length);

                float randomPoins = cloneSpawnPoint[i]; // Берём точки спавна по порядку, так как массив с ними уже перемешан

                whereToSpawn = new Vector2(transform.position.x, randomPoins);

                Instantiate(enemies[rand], whereToSpawn, Quaternion.identity);
            }

            timeBtwSpawn = spawnTime;
        }
        else
        {
            timeBtwSpawn -= Time.deltaTime;
        }
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Спавнер массива объектов

Сообщение Jarico 20 июн 2020, 19:36

samana писал(а):Вы можете перед созданием врагов - создать клон массива позиций, перемешать его (например с помощью Linq) и выбирать нужное кол-во позиций по порядку из этого клона массива позиций. Таким образом вы просто не сможете выбрать одновременно одну и ту же позицию за один проход. Конечно можно что-то и упростить или сократить, поэтому код не идеален.


Проще заюзать Random.Range(0,spawnPoints.Length);
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Спавнер массива объектов

Сообщение HolleWrold 20 июн 2020, 19:47

samana писал(а):Вы можете перед созданием врагов - создать клон массива позиций, перемешать его (например с помощью Linq) и выбирать нужное кол-во позиций по порядку из этого клона массива позиций. Таким образом вы просто не сможете выбрать одновременно одну и ту же позицию за один проход. Конечно можно что-то и упростить или сократить, поэтому код не идеален.

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

public class Test : MonoBehaviour
{
    public GameObject[] enemies;

    Vector2 whereToSpawn;
    float[] spawnPoints = { -1f, -0.5f, 0f, 0.5f, 1f };

    private float timeBtwSpawn;
    public float spawnTime;

    public int enemiesSpawnAmount = 1; // количество появляющихся врагов

    void Update()
    {
        if (timeBtwSpawn <= 0)
        {
            // создали клон массива позиций и перемешали его
            float[] cloneSpawnPoint = spawnPoints.OrderBy(i => Random.Range(0f, 1f)).ToArray();

            // создание нужного кол-ва врагов
            for (int i = 0; i < enemiesSpawnAmount; i++)
            {
                int rand = Random.Range(0, enemies.Length);

                float randomPoins = cloneSpawnPoint[i]; // Берём точки спавна по порядку, так как массив с ними уже перемешан

                whereToSpawn = new Vector2(transform.position.x, randomPoins);

                Instantiate(enemies[rand], whereToSpawn, Quaternion.identity);
            }

            timeBtwSpawn = spawnTime;
        }
        else
        {
            timeBtwSpawn -= Time.deltaTime;
        }
    }
}
 


Большое спасибо, все работает)
HolleWrold
UNец
 
Сообщения: 17
Зарегистрирован: 20 июн 2020, 12:09


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

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

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