| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Pixelart
- 모작
- 개발
- 기초
- 반환원정대
- pixel art
- 드로잉
- 서포터즈
- 장학팀
- 연습
- 픽셀 아트
- 애니메이션
- 멋쟁이사자처럼
- COSMO
- 도트공부
- 도트
- 스마일게이트
- 픽셀아트
- 자원순환보증금관리센터
- 드로잉 연습
- 에이세프라이트
- photoshop
- Aseprite
- 포토샵
- TOOL
- layer
- 인디게임 개발
- menu
- 노하우
- 채색
- Today
- Total
소소한 나의 하루들
Grid Cell Coordinate(격자 셀 좌표) <->World Coordinate(월드 좌표) 변환 본문
이번 내용은 랜덤 맵을 구현하는 과정 중 각 방에 할당되는 SpawnPoint의 좌표 조정에서 발생하는 Grid Cell Coordinate와 World Coordinate 간 불일치 문제를 해결하기위해 따로 작성하게 되었다.
위 글의 내용과도 관련이 있기에 링크를 달아두었다.

프리펩을 구성할 때 방 오브젝트들은 Tilemap에 배치했으면서 SpawnPoint는 (Script 컴포넌트로 기능을 대체할) 빈 오브젝트들이었기에 Tilemap Palette에 배치되지도 않았고.. 해서 등등의 이유로 직접 Transform의 값을 입력해서 좌표를 구성했다.

그렇게 했더니, 프리펩 맵 생성 시 방 오브젝트 위치에 관계없이 초기 World Coordinate로 배치됐던 SpawnPoint 오브젝트들이 그 좌표 그대로 생성되는 문제가 발생했다. 위에서 설명했듯 빈 오브젝트는 Tile Palette에 배치되지 않아서 자동으로 방 오브젝트와 Grid Cell 좌표계를 공유할수도 없었고, 직접 입력하자니 이런 문제가 발생하게 되어 스크립트를 통해 방 오브젝트의 좌표를 기준으로 상대적으로 SpawnPoint 오브젝트의 좌표를 설정해줘야했다.
Tilemap은 Grid 컴포넌트 아래에 배치되며, Grid Cell 좌표계(Grid Cell Coordinate)를 기준으로 타일을 배치한다. 정확한 내부 원리는 모르지만 Tilemap에 배치된 오브젝트는 Scene에 배치할 때 자동으로 Grid 컴포넌트 하위에 포함되며 유니티에서는 이 Grid Cell Coordinate를 World Coordinate으로 변환하게 될 것으로 생각했다.
public class SpawnPoint : MonoBehaviour
{
public Tilemap roomPos;
public Vector3 pointPos; //좌표 확인용
private Vector3 offset; //offset distance
private RoomTemplates roomTemplates;
private RoomSpawner roomSpawner;
private void Awake()
{
roomTemplates = GetComponent<RoomTemplates>();
roomSpawner = GetComponent<RoomSpawner>();
}
void Start()
{
//offset Format
switch (roomSpawner.openedDirections)
{
case 1: //top
offset = new Vector3(0, 0.75f, 0);
break;
case 2: //bottom
offset = new Vector3(0, -0.75f, 0);
break;
case 3: //left
offset = new Vector3(-0.75f, 0, 0);
break;
default: //right
offset = new Vector3(0.75f, 0, 0);
break;
}
Vector3Int cellCoordinate = roomPos.WorldToCell(transform.position);
Vector3 cellCenter = roomPos.GetCellCenterWorld(cellCoordinate);
transform.position = cellCenter + offset;
pointPos = transform.position;
}
}

유니티가 내부적으로 방 오브젝트는 (Tilemap으로 배치함으로서) Grid Cell Coordinate를 World Coordinate로 변환시켜줄 것이다. 따라서 방 오브젝트에 대하여 다시 World 좌표를 Grid Cell 좌표로 변환해준다. 그런데 이때 Cell 좌표는 Grid Anchor 기준 왼쪽 하단 모서리 위치 좌표일 것이고, 다시 해당 Cell 좌표를 다시 World 좌표계의 Cell 중앙 위치로 변환하는 과정이 필요하다.
결과적으로 이렇게 하면 해당 셀의 중심 위치를 World 좌표로 정확히 얻을 수 있게된다.
이제 방 오브젝트가 위치한 Grid Cell 좌표의 World 좌표를 알아냈으니, 여기서 의도했던대로 중심으로부터 일정거리 떨어진 지점을 SpawnPoint의 좌표로 설정해주면 된다. 그렇게 하면 프리펩이 어디에 생성되든지 '방 오브젝트'를 기준으로 SpawnPoint 오브젝트의 위치가 따라가게 된다.
'개발 > 게임개발' 카테고리의 다른 글
| 랜덤 맵 시스템 개발 (0) | 2025.05.06 |
|---|---|
| 플레이어 이동 구현 : Sub-State Machine 활용(Animator) (0) | 2025.01.23 |
| 프로젝트 재시작 : 스프라이트 PPU 변경하기 (0) | 2025.01.20 |
| 맵 이동 & 카메라 좌표 조정 (0) | 2025.01.17 |
| (아이작라이크 혹은 팬게임이 될지모를) 첫 게임 개발 프로젝트 01. [프로젝트명 : 미정] (0) | 2025.01.06 |