Orion447
Orion447

Reputation: 400

Creating a grid like structure based on the area of an room

so in unity im creating randomly generating rooms. inside of these rooms i will "randomly" place objects, enemy,objects,items etc. based on nodes. nodes are transform objects that are separated from each other by 1 unit. the idea is that i can now pick a node and instantiate something at that node. The code works great when the room is 10x10(x,z since its a 3d game) i get a nice grid pattern it also works as expected when x is any multiple of 2. however when z changes from 10 it doesn't create the grid properly. there is also a problem if the room changes locations other then 0,0.

floor is a child object of the room.

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

Here are some pictures to help illustrate the issue the first image is when the room is at 0,0 and it creates a nice grid pattern working correctly

not working correctly

when the room is offest it creates the grid still at 0,0

Upvotes: 1

Views: 229

Answers (1)

Orion447
Orion447

Reputation: 400

i figured it out, it happend to do with with the local and world scale/pos of the floor and the room

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

works as intended, creates a grid of nodes on the floor of anyroom square room

Upvotes: 1

Related Questions