2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

응용프로그래밍/유니티기초

[유니티2D] 타일맵을 이용하여 배열 맵 구축

파아란기쁨1 2022. 6. 6. 15:07
반응형

Backyard - Free.zip
0.07MB

위의 파일을 다운로드 하여 프로젝트 추가

하이어라키 -> 2D Object -> Tilemap-> Rectangular 선택하여 타일맵 추가

Open Tile Palette 를 클릭하여 타일맵 팔렛트를 오픈(Open Tile Palette 가 보이지 않는 경우 Windows->2D->Tile Palette 선택)

팔렛트가 뜨면 아래 이미지를 모두 선택해서 드래그&드롭 

팔레트에서 이미지 선택하여 드래그&드롭으로 지도를 그린다.

background 타일로 전체를 잔디밭으로 만든다.

background를 이용하여 맵의 크기를 생성하기 위해 Box Collider 2D를 추가하여 background 크기에 맞춰서 설정을 해 준다.

 

새로운 타일맵을 생성하여 주변에 벽을 쌓고 중간 중간에 돌과 기타 장애물을 이용하여 갈 수 없는 곳을 만들어 본다.

[ (대괄호) 키를 이용해서 이미지를 회전 시킬 수 있다.

위와 같이 대강 그렸다. 위에 그린것을 벽으로 해서 벽을 지나가지 못하도록 배열을 만들어 보려고 한다.

먼저 layer 에 wall 을 추가하자.

그리고 Tilemap Collider 2D를 추가한다.

Grid 를 좌하를 0,0 위치에 맞춰야 나중에 배열에서 처리하기가 쉽다.

좌하를 0,0 위치에 맞춰 보자.

먼저 맵의 크기를 체크한다. squer를 하나 추가해서 맵의 좌하 위치에 갖다 놓고 포지션을 살펴 보자.

우상 위치에 갖다 놓고 위치를 확인하자.

-29.5 ~ 29.5,-16.5~16.5 이므로 x축으로 29.5, y축으로 16.5 만큼 올려 주면 좌하가 0,0 위치에 오게 된다.

 

GameManager 를 추가하여 위의 지도를 배열의 위치에 벽과 갈 수 있는 길의 위치를 0,1 로 셋팅해 보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 외부에서 싱글톤 오브젝트를 가져올때 사용할 프로퍼티
    public static GameManager instance
    {
        get
        {
            // 만약 싱글톤 변수에 아직 오브젝트가 할당되지 않았다면
            if (m_instance == null)
            {
                // 씬에서 GameManager 오브젝트를 찾아 할당
                m_instance = FindObjectOfType<GameManager>();
            }

            // 싱글톤 오브젝트를 반환
            return m_instance;
        }
    }

    private static GameManager m_instance; // 싱글톤이 할당될 static 변수
    private int[,] mapArray;
    private float _sizeX=0,_sizeY=0;
    public float sizeX{
        get{return _sizeX;}
        set{
            _sizeX=value;
            Debug.Log("_sizeX : " + _sizeX.ToString());
        }
    }
    public float sizeY{
        get{return _sizeY;}
        set{
            _sizeY=value;
            Debug.Log("_sizeY : " + _sizeY.ToString());
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

background 에서 게임 시작하면서 자신의 크기를 확인하여 gamemananger에 셋팅 해 주자.

BackgroundStart 스크립트를 만들어서 다음과 같이 크기 확인해서 설정

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackgroundStart : MonoBehaviour
{
    Collider2D m_Collider;
    Vector3 m_Size;
    // Start is called before the first frame update
    void Start()
    {
        m_Collider = GetComponent<Collider2D>();
        m_Size = m_Collider.bounds.size;
        Debug.Log("Collider Size : " + m_Size);
        GameManager.instance.sizeX = m_Size.x;
        GameManager.instance.sizeY = m_Size.y;
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

맵의 크기를 확인 할 수 있다 또한 배열의 크기가 60 * 34 크기로 할당이 된다.

 

여기서 벽이 아니라면 0 을 벽이라면 1을 입력하는 프로그램을 만들어 보자.

GameManager에 다음 메서드를 추가

    public void MakeArray()
    {

        mapArray=new int[(int)sizeX,(int)sizeY];
        string output="";

        for (int i = 0; i < (int)sizeX; i++)
        {
            for (int j = 0; j < (int)sizeY; j++)
            {
                bool isWall = false;
                foreach (Collider2D col in Physics2D.OverlapCircleAll(new Vector2(i, j), 0.4f)){
                    if (col.gameObject.layer == LayerMask.NameToLayer("wall")) isWall = true;
                    else if (col.gameObject.tag == "Player") Debug.Log("Player : " + i.ToString() + "," + j.ToString());
                }
                    

                mapArray[i, j] = isWall?1:0;
                output+=mapArray[i, j].ToString();
                
            }
            output+="\n";
        }
        Debug.Log(output);
    }

이렇게 만들어서 호출을 해 보면 

맵이 만들어져 있는 것을 확인 할 수 있다.

따라서 플레이어를 한 지점에서 어떤 지점으로 이동하는 경로를 맵을 보면서 이동 시킬 수가 있다.

반응형