2d 자동 맵생성

맵 자동 생성(9)

게임만드는학생 2025. 5. 13. 20:17

이번 글에서는 복도에 콜라이더 설정을 해보겠다.

추가로 시작 전 랜덤한 방을 선택해 그 안에서 캐릭터가 시작하도록 했다. 

 

복도에 콜라이더를 설정해서 복도로만 다니게 해야하는데 이게 생각보다 까다롭다.

 

복도를 만들면서 일자구간, 모서리 부분에 각각 다른 콜라이더 모양을 설정해야하기 때문이다. 

 

우선 나는 총 6가지로 콜라이더 모양을 구분했다. 

밑에 두가지는 일자 통로에 사용하는 것이고, 위에 4가지가 모서리이다. 

 

그렇다면 어떤 것이 일자로 된 통로이고, 어떤 것이 어느 방향의 모서리일까?

 

이를 위해 기존에 통로를 만드는 알고리즘을 활용했다. 

복도이기 때문에 2중for문으로하지 않고 for문 두번을 이용해 복도를 만들었다. 

이 때, x -> y 순으로 그리냐, y -> x 순으로 그리냐에 따라서 복도 모양도 위 4가지로 나뉘어진다. 

 

그래서 현재 방향을 for문의 증감으로 따졌다. 

x 를 다루는 for문에서 증가하면 오른쪽이동이고, 모서리는 오른쪽을 막으면 된다.

또 y를 다루는 for문에서 증가하면 위쪽 이동이기 때문에 모서리는 위쪽을 막으면 된다. 

 

이렇게 오른쪽 -> 위쪽 이동이라면 모서리 타일의 오른쪽, 그리고 위쪽으로 이동할 것이기 때문에 아래쪽을 막는다. 

따라서 저 모양이 나오게 된다. 물론 이건 x 이동 후 y 이동일 때이다. y 이동 후 x 이동이라면 반대모양이 나오게 된다. 

 

이 원리를 적용한 코드를 살펴보겠다. 

void CreateCorridors(GameObject parent,Vector2 v, Vector2 v2, bool mode/* true : x -> y , false : y -> x */)
{
    Vector2Int pos = new Vector2Int((int)v.x, (int)v.y);
    Vector2Int pos2 = new Vector2Int((int)v2.x, (int)v2.y);

    int dx = (pos2.x > pos.x) ? 1 : -1;
    int dy = (pos2.y > pos.y) ? 1 : -1;

CreateCorridors 함수를 보면 mode를 매개변수로 받는다. x->y, y->x 에 따라서 모양이 달라지기 때문에 받는다고 위에서 언급했다. 

그리고 x,y의 이동방향을 dx,dy로 볼 수 있다. 

 

if (mode)
{
    for (int x = pos.x; x != (pos2.x + dx); x += dx)
    {
        GameObject go=null;
        if(pos2.x == x)
        {
            // 모서리 생성 (pos2.x,pos.y)
            GameObject prefab = GetDirToCorridorTile((dx > 0), (dy < 0));
            go = Instantiate(prefab, new Vector2(pos2.x, pos.y), Quaternion.identity);
        }
        else
        {
            // new Vector2(x, pos.y)
            go = Instantiate(corridorTile[0], new Vector2(x, pos.y), Quaternion.identity);
        }
        if(go!=null)
            go.transform.SetParent(parent.transform, true);
    }

    for (int y = pos.y; y != (pos2.y + dy); y += dy)
    {
        if(y == pos.y)
            continue;
        GameObject go = Instantiate(corridorTile[1], new Vector2(pos2.x, y), Quaternion.identity);
        go.transform.SetParent(parent.transform, true);
    }
}

mode가 true일때, x이동 후 y 이다. 

첫번째 for문은 x이동이고 두번째 for문은 y이동이다. 

 

보면 pos2.x 일 때가 모서리를 놓을 위치이기 때문에 그 때 생성한다. GetDirToCorridorTile함수를 호출하는데 매개변수와 함께 설명하겠다. 

 

y이동 후 x 도 마찬가지인데 코드만 올려두겠다. 

else
{
    for (int y = pos.y; y != (pos2.y + dy); y += dy)
    {
        GameObject go = null;
        if( y == pos2.y)
        {
            // (pos.x, pos2.y) 모서리 생성
            GameObject prefab = GetDirToCorridorTile((dx < 0), (dy > 0));
            go = Instantiate(prefab, new Vector2(pos.x, pos2.y), Quaternion.identity);
        }
        else
        {
            // (pos.x, y) 생성
            go = Instantiate(corridorTile[1], new Vector2(pos.x, y), Quaternion.identity);
        }
        if(go!=null)
            go.transform.SetParent(parent.transform, true);
    }
    for (int x = pos.x; x != (pos2.x + dx); x += dx)
    {
        if (x == pos.x) continue;
        
        GameObject go = Instantiate(corridorTile[0], new Vector2(x, pos2.y), Quaternion.identity);
        go.transform.SetParent(parent.transform, true);
    }
}

이게 mode가 false일 때, 즉 y이동 후 x 이동이다. 

 

이제 어떤 모서리모양을 줄지 선택해주는 함수를 살펴보겠다.

GameObject GetDirToCorridorTile(bool x, bool y)
{
    // lf
    if (!x && !y) return corridorTile[2];
    // lb
    else if (!x && y) return corridorTile[3];
    // rf
    else if (x && !y) return corridorTile[4];
    // rb
    else if(x && y) return corridorTile[5];

    else return null;
}

x,y 에 따라서 return을 해주는데 미리 프리팹으로 각 모서리 모양을 만들어두었다. 

주석으로 lf 이렇게 되어있는 것은 l : 왼쪽, f : front= 아래쪽 이다. 

rb 는 r : 오른쪽, b : back = 위쪽이다. 

x-> y 이동을 기준으로 했을 때, x가 음수면 왼쪽이동이라서, 왼쪽을 막아야하고, y가 음수라면 아래로 이동이기 때문에 위쪽을 막아야한다. 

 

따라서 mode == true 일때, 함수를 호출하려면 dx > 0 과 dy < 0 을 호출한다. 좌우는 그대로 이동방향을 막지만 위 아래는 보다시피 반대로 막아야하기 때문이다. 

 

또 mode==false 일 때, 호출은 조건을 반대로 하면 해결된다. 

 

보면 통로 테두리에 노랗게 칠해져있는것이 콜라이더이다. 

 

Game화면이다. 

 

사진을 보면 일자통로일때는 예외처리를 해야겠다. 모서리를 안만들도록...

 

이로써 통로까지 모두 완료되었고, 몬스터 기능과, 미니맵, 룸클리어 효과정도 넣을 예정이다. 

 

플레이어는 그냥 랜덤으로 방하나 지정해서 방 가운데에 세팅했다. 

 

'2d 자동 맵생성' 카테고리의 다른 글

맵 자동 생성(11)  (0) 2025.05.14
맵 자동 생성(10)  (1) 2025.05.14
맵 자동 생성(8)  (0) 2025.05.13
맵 자동 생성(7)  (0) 2025.05.13
맵 자동 생성(6)  (0) 2025.05.12