Создание сеткообразной структуры на основе площади комнаты - PullRequest
1 голос
/ 02 апреля 2019

так в единстве я создаю случайно генерируемые комнаты.внутри этих комнат я буду «случайным образом» размещать объекты, врагов, объекты, предметы и т. д. на основе узлов.узлы - это объекты преобразования, которые отделены друг от друга на 1 единицу.идея в том, что теперь я могу выбрать узел и создать экземпляр чего-либо в этом узле.Код отлично работает, когда комната 10х10 (x, z, поскольку это 3d-игра). Я получаю хороший сеточный шаблон, он также работает, как и ожидалось, когда x кратен 2. Однако, когда z изменяется от 10, он не создаетсетка правильно.Существует также проблема, если комната меняет местоположение, отличное от 0,0.

Этаж - это дочерний объект комнаты.

void RoomSetup()
    {
        bool first = true;
        int collCount = -1;
        GameObject placeHolder = new GameObject("temp");
        float colls;
        float offX, offZ;
        colls = floor.transform.localScale.x - 1;

        print(colls);
        for (int i = 0; i < ((floor.transform.localScale.x-1) 
 *(floor.transform.localScale.z-1)); i++)
        {

//creating a for loop that stops when its greater then the area of the rectangle, subtract one from x,z so theres a one unit of padding from the walls.

            offX = floor.transform.lossyPosition.x;
            offZ = floor.transform.lossyPosition.z;
            //getting the offset of the room in world space this is where i believe the issues arise 

            collCount++;

            GameObject temp = new GameObject(i + " Node");
            temp.transform.SetParent(floor.transform);
            temp.AddComponent<BoxCollider>();
            temp.GetComponent<BoxCollider>().isTrigger = true;


            if(!first)
            {
                temp.transform.position = new Vector3((placeHolder.transform.position.x + 1), 6, placeHolder.transform.position.z);
                placeHolder = temp;
                if (collCount >= colls)
                {
                    print("new line on " + temp.name + " coll " + collCount);
                    collCount = 0;
                    placeHolder.transform.position = new Vector3((-(floor.transform.localScale.x / 2) + 1)+offX, 6, (placeHolder.transform.position.z - 1)-offZ);
                }
            }
            if (first)
            {
                // print(colls);
                temp.transform.position = new Vector3((-(floor.transform.localScale.x / 2) + 1) + offX, 6, floor.transform.localScale.z - offZ);
                placeHolder = temp;
                first = false;
            }

            nodes.Add(temp);
        }
    }

Вот несколько картинок, которые помогут проиллюстрировать проблему: первое изображение, когда комната находится в точке 0,0, создает хорошийсетка working correctly

not working correctly

, когда комната находится в самом разгаре, она создает сетку еще в 0,0

1 Ответ

1 голос
/ 02 апреля 2019

Я понял, это связано с локальным и мировым масштабом / положением пола, и комната

 void RoomSetup()
    {
        bool first = true;
        int collCount = -1;
        GameObject placeHolder = new GameObject("temp");
        float colls;

        colls = floor.transform.localScale.x - 1;

        offX = floor.transform.localScale.x;
        offZ = floor.transform.localScale.z;
        offX = (offX / 2) - offX + 1;
        offZ = (offZ / 2) - 1;
        offX = offX + floor.transform.position.x;
        offZ = (offZ + floor.transform.position.z);
        print(colls);
        for (int i = 0; i < ((floor.transform.localScale.x-1) * (floor.transform.localScale.z-1)); i++)
        {
            collCount++;
            //print(collCount);
            GameObject temp = new GameObject(i + " Node");
            temp.transform.SetParent(floor.transform);
            temp.AddComponent<BoxCollider>();
            temp.GetComponent<BoxCollider>().isTrigger = true;

            if(!first)
            {
                temp.transform.position = new Vector3((placeHolder.transform.position.x + 1), 6, placeHolder.transform.position.z);
                placeHolder = temp;
                if (collCount >= colls)
                {
                    print("new line on " + temp.name + " coll " + collCount);
                    collCount = 0;
                    temp.transform.position = new Vector3(floor.transform.localPosition.x + offX, 6, placeHolder.transform.position.z - 1);
                    placeHolder = temp;
                }
            }
            if (first)
            {
                // print(colls);
                temp.transform.position = new Vector3(floor.transform.localPosition.x+offX, 6, floor.transform.localPosition.z+offZ);
                placeHolder = temp;
                first = false;
            }

            nodes.Add(temp);
        }
    }

работает, как задумано, создает сетку узлов на полу любой комнаты.квадратная комната

...