C # проблема генератора карт мира - PullRequest
1 голос
/ 22 апреля 2019

Я работаю над игрой, которая будет содержать мозаичную карту 1000 x 1000 в форме квадрата, но у меня возникли проблемы.

Я попытался сделать два разных сценария, чтобы решить эту проблему.Первым был небрежный подход к тому, что мне нужно.Мой второй скрипт - более эффективный подход к тому, что мне нужно.

Скрипт 1:

 void fill()
    {
        for (float i = 0; i != 1000; i++)
        {
            Instantiate(GameObject.Find("Dirt"), new Vector2(xPos++, yPos), Quaternion.identity);
            xrepeat++;
            if (xrepeat == 1000)
            {
                xPos = 0;
                yPos = yPos - 1;
                yrepeat++;
                if(yrepeat != 1000)
                {
                    i = 0;
                    xPos = 0;
                }
                if(xPos < 0) //Prevents an overflow.
                {
                    break;
                }
            }
        }

Скрипт 2:

    void buildx()
    {
        for (int i = 1000; i != 0; i--)
        {
            Instantiate(GameObject.Find("Dirt"), new Vector2(xPos++, yPos), Quaternion.identity);
            if (xPos == 1000)
            {
                buildy();
            }
        }
    }
    void buildy()
    {
        if (yPos == -1000)
        {
            Destroy(this); // Job is done, time to pack up
        }
        else
        {
            for (int i = 1000; i != 0; i--)
            {
                Instantiate(GameObject.Find("Dirt"), new Vector2(xPos, yPos--), Quaternion.identity);
                buildx();
            }
        }
    }

Первый скрипт дублировал мой блок грязиЗатем 1000 раз вычтите ось y на 1 и повторяйте, пока она не достигнет квоты.Это работало, но к концу работы сдалось.Второй сценарий пинг-понг назад и вперед между осями x и y, проверяя квоту 1000, но по какой-то причине он застыл.

Я в значительной степени отказался от сценария 1 в пользу сценария 2, потому что я думал, что сценарий 2 был болееэффективный.

Есть ли способ заставить скрипт 2 работать?

1 Ответ

0 голосов
/ 22 апреля 2019

Я бы настоятельно рекомендовал изучить систему работы Unity, но ваши циклы невероятно запутаны, я не уверен, что там происходит ... Похоже, вы слишком усложняете это. Вот как я бы подошел создать экземпляр карты размером 1000x1000, если бы мне пришлось создавать все их экземпляры:

public int mapWidth = 30;
public int mapHeight = 30;

void fill()
{
    // Doing this once at the beginning, so it isn't super expensive...
    GameObject basePrefab = GameObject.Find("Dirt"); 
    // Creating 1 Vector3 that we can just update the values on
    Vector3 spawnPosition = Vector3.zero;

    for(int x = 0; x < mapWidth; ++x)
    {
        // Update the spawn x Position
        spawnPosition.x = x;
        for(int y = mapHeight; y > 0; y--)
        {
            // Update the spawn y position
            spawnPosition.y = y;
            Instantiate(basePrefab, spawnPosition, Quaternion.identity);
        }
    } 
}

Если вы хотите прочитать или увидеть пример пула объектов для карты тайлов, такой как система, вот ответ, который я написал некоторое время назад, который должен дать вам суть этого: Какой самый быстрый метод для создания и рендер большого количества 2d спрайтов в Unity?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...