Цикл проверки занятости координат и их заполнение

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Цикл проверки занятости координат и их заполнение

Сообщение vkmatros 23 ноя 2021, 20:43

Здравствуйте, форумчане. Начинающему разработчику никак не получается найти решение задачи, цель которой в том, чтобы после проверки координат на наличие в них объектов создавать объекты на свободных координатах. Логика написанного кода в том, что сначала присваивается случайная координата из массива, далее она проверяется на занятость, и если свободна, то занимается объектом, если занята, то цикл повторяется с другой координатой. Но получается так, что она просто бесконечно создаёт объекты в рандомных местах (по координатам), хотя должна остановиться по достижению 10 объектов в сцене. Подскажите, пожалуйста, что может быть не так? Заранее благодарю за ответ.
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;

public class Enem3 : MonoBehaviour
{
    public GameObject enemies;
    private Vector2[] coordinats = new Vector2[]
    {
        new Vector2(0, 1),
        new Vector2(0, 3),
        new Vector2(3, 1),
        new Vector2(3, 3),
        new Vector2(-3, 1),
        new Vector2(-3, 3),
        new Vector2(6, 1),
        new Vector2(-6, 1),
        new Vector2(6, 3),
        new Vector2(-6, 3),
    };
    void Start()
    {
        StartCoroutine(Spawn());
        IEnumerator Spawn()
        {
            while (true)
            {
                Vector2 tour = coordinats[Random.Range(0, 10)];
                Collider[] intersecting = Physics.OverlapSphere(tour, 0.01f);
                if (intersecting.Length == 0)
                {
                    Instantiate(
                           enemies,
                           tour,
                           Quaternion.identity);
                    yield return new WaitForSeconds(0.5f);
                }
            }
        }
    }
}
 
vkmatros
UNец
 
Сообщения: 4
Зарегистрирован: 23 ноя 2021, 20:10

Re: Цикл проверки занятости координат и их заполнение

Сообщение 1max1 23 ноя 2021, 21:34

хотя должна остановиться по достижению 10 объектов в сцене.

И где же у тебя выход из цикла? Вообще тут можно и без рандома обойтись, как мне кажется. Просто перемешивай массив через Shuffle https://stackoverflow.com/questions/273 ... ze-a-listt, а потом в обычном for цикле создавай объекты.
Кстати, я заметил что у тебя координаты 2д, но используешь ты OverlapSphere, который предназначен для 3д коллайдеров и если твоя игра 2д и на объектах 2д коллайдеры, то она всегда будет возвращать пустой массив.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Цикл проверки занятости координат и их заполнение

Сообщение vkmatros 24 ноя 2021, 18:18

Спасибо, изменив коллайдер с 3d на 2d действительно получилось добиться того, чтобы объект создавался только на пустом месте. Но проблема респауном до 10 на сцене осталась. Попробовал задать циклу переменную, зависящую от заполненности сцены, но в таком случае, по достижении 10 объектов юнити просто зависает и всё (в принципе как и без части кода из update), из-за чего такое может происходить?
Синтаксис:
Используется csharp
void Start()
    {
        StartCoroutine(Spaw());
        IEnumerator Spaw()
        {
            while (Spawn)
            {
                Vector2 tour = coordinats[Random.Range(0, 10)];
                Collider2D[] intersecting = Physics2D.OverlapCircleAll(tour, 0.01f);
                if (intersecting.Length == 0)
                {
                    Instantiate(
                           enemies,
                           tour,
                           Quaternion.identity);
                    yield return new WaitForSeconds(0.5f);
                }
            }
        }
    }
    void Update()
    {
        GameObject[] enem = GameObject.FindGameObjectsWithTag("Enemies");
        enemiesCount = enem.Length;
        if (enemiesCount < 10)
        {
            Spawn = true;
        }
        else
        {
            Spawn = false;
        }
    }
 
vkmatros
UNец
 
Сообщения: 4
Зарегистрирован: 23 ноя 2021, 20:10

Re: Цикл проверки занятости координат и их заполнение

Сообщение 1max1 24 ноя 2021, 18:25

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

public class Enem3 : MonoBehaviour
{
    public GameObject enemies;

    Vector2[] coordinates = new Vector2[]
    {
        new Vector2(0, 1),
        new Vector2(0, 3),
        new Vector2(3, 1),
        new Vector2(3, 3),
        new Vector2(-3, 1),
        new Vector2(-3, 3),
        new Vector2(6, 1),
        new Vector2(-6, 1),
        new Vector2(6, 3),
        new Vector2(-6, 3),
    };

    IEnumerator Start()
    {
        coordinates.Shuffle();

        foreach (var p in coordinates)
        {
            Instantiate(enemies, p, Quaternion.identity);

            yield return new WaitForSeconds(0.5f);
        }
    }
}

public static class ExArrays
{
    public static void Swap<T>(this T[] me, int i, int j)
    {
        var r = me[i];
        me[i] = me[j];
        me[j] = r;
    }

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

Re: Цикл проверки занятости координат и их заполнение

Сообщение vkmatros 24 ноя 2021, 18:51

Спасибо большое, буду разбираться что за функции и как работают)
vkmatros
UNец
 
Сообщения: 4
Зарегистрирован: 23 ноя 2021, 20:10

Re: Цикл проверки занятости координат и их заполнение

Сообщение vkmatros 30 ноя 2021, 12:53

Я правильно понимаю, что цикл foreach работает, пока не переберёт все элементы массива, и после этого прекращает работу? И для того чтобы скрипт продолжил создание enemies после удаления клона/клонов со сцены с одной или из несколько координат, сделав их пустыми, нужно использовать другой цикл? Если всё так, то никак не могу понять, каким образом, используя Shuffle, поместить координату в Instantiate используя, например, цикл while?
1max1 писал(а):
Синтаксис:
Используется csharp
using System.Collections;
IEnumerator Start()
    {
        coordinates.Shuffle();

        foreach (var p in coordinates)
        {
            Instantiate(enemies, p, Quaternion.identity);

            yield return new WaitForSeconds(0.5f);
        }
 
vkmatros
UNец
 
Сообщения: 4
Зарегистрирован: 23 ноя 2021, 20:10

Re: Цикл проверки занятости координат и их заполнение

Сообщение 1max1 30 ноя 2021, 15:19

Shuffle просто перемешивает элементы массива, чтобы что-то добавить в массив используй List вместо массива и команду Add. Ну и суфле под лист другое будет, ссылка выше.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot], Google [Bot] и гости: 31