위의 파일을 다운로드 하여 프로젝트 추가
하이어라키 -> 2D Object -> Tilemap-> Rectangular 선택하여 타일맵 추가
Open Tile Palette 를 클릭하여 타일맵 팔렛트를 오픈(Open Tile Palette 가 보이지 않는 경우 Windows->2D->Tile Palette 선택)
팔렛트가 뜨면 아래 이미지를 모두 선택해서 드래그&드롭
팔레트에서 이미지 선택하여 드래그&드롭으로 지도를 그린다.
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);
}
이렇게 만들어서 호출을 해 보면
맵이 만들어져 있는 것을 확인 할 수 있다.
따라서 플레이어를 한 지점에서 어떤 지점으로 이동하는 경로를 맵을 보면서 이동 시킬 수가 있다.
'응용프로그래밍 > 유니티기초' 카테고리의 다른 글
[유니티2D] 네비게이션 길의 경로 표시하기 (0) | 2022.06.07 |
---|---|
[유니티2D] 배열맵을 이용하여 출발지에서 목표로 이동하는 네비게이션 만들기 (0) | 2022.06.06 |
[유니티2D 활용] 테트리스 게임 만들기 (0) | 2022.06.03 |
[유니티2D활용]지뢰찾기 게임 만들기 (0) | 2022.06.01 |
[유니티기초]2-05. 플레이어 위치를 찾아서 그쪽으로 이동을 해 보자. (0) | 2022.06.01 |