내일배움캠프 38일차 TIL : Maze 맵 생성

woollim·2024년 11월 14일
0

내일배움캠프TIL

목록 보기
34/36
post-thumbnail

■ 학습 개요

오늘 계획

  • 심화 과제 완료
  • 심화 과제 Maze 정리


■ 심화 과제 맵 생성

using UnityEngine;

public enum TileType
{
    NONE = 0,
    EMPTY,
    WALL,
}

public class TilemapGenerator : MonoBehaviour
{
    public GameObject tilePrefab;
    public GameObject ground;
    public int gridSize;
    public TileType[,] tileMap;

    private void Awake()
    {
        gridSize = (int)ground.transform.localScale.x * 10;
        tileMap = new TileType[100, 100];

        GenerateMap();

        Render();
    }

    void Render()
    {
        for (int x = 0; x <= gridSize; x++)
        {
            for (int z = 0; z <= gridSize; z++)
            {
                if (tileMap[x, z] == TileType.WALL)
                {
                    Vector3 position = new Vector3(x - gridSize / 2, tilePrefab.transform.localScale.y / 2, z - gridSize / 2);
                    Instantiate(tilePrefab, position, Quaternion.identity, transform);
                }
            }
        }


    }


    void GenerateMap()
    {
        // 첫 맵 작업, 일정한 간격을 두고 비어있음
        for (int x = 0; x <= gridSize; x++)
        {
            for (int z = 0; z <= gridSize; z++)
            {
                if (x % 2 == 0 || z % 2 == 0)
                {
                    tileMap[x, z] = TileType.WALL;
                }
                else
                {
                    tileMap[x, z] = TileType.EMPTY;
                }
            }
        }

        // 랜덤으로 우측 혹은 아래로 길을 뚫는 작업
        for (int x = 0; x <= gridSize; x++)
        {
            for (int z = 0; z <= gridSize; z++)
            {
                if (z % 2 == 0 || x % 2 == 0)
                {
                    // 벽 일때는 작업 스킵
                    continue;
                }

                if (z == gridSize && x == gridSize)
                {
                    // 맵 끝부분(출구)도 스킵
                    continue;
                }

                if (x == gridSize - 1)
                {
                    // 맨 아래쪽에 왔을땐 우측으로만 길 뚫
                    tileMap[x, z + 1] = TileType.EMPTY;
                    continue;
                }

                if (z == gridSize - 1)
                {
                    // 맨 오른쪽에 왔을땐 아래로만 길 뚫
                    tileMap[x + 1, z] = TileType.EMPTY;
                    continue;
                }

                if (Random.Range(1, 100) % 2 == 0)
                {
                    // 우측으로 길 뚫
                    tileMap[x, z + 1] = TileType.EMPTY;
                }
                else
                {
                    // 아래로 길 뚫
                    tileMap[x + 1, z] = TileType.EMPTY;
                }
            }
        }
    }
}

0개의 댓글