유니티 로그라이크 미니맵 구현Unity/UI2023. 12. 20. 20:53
Table of Contents
기능 구현
미니맵 구현에 필요한 Fields
#region Fields
[SerializeField] private Transform miniRoomContainer;
private float cellWidth;
private float cellHeight;
private GameObject miniRoomPrefab;
private GameObject[,] miniRoomArray;
private Vector2Int currentPlayerCoordinate;
private List<Vector2> visitedCoordinates = new List<Vector2>();
#endregion
- miniRoomContainer : 미니맵 셀들이 배치되는 Transform Parent
- cellWidth : 미니맵 셀의 너비
- cellHeight : 미니맵 셀의 높이
- miniRoomPrefab : 미니맵 셀의 프리팹
- miniRoomArray : 미니맵 셀들을 저장하는 2D 배열
- currentPlayerCoordinate : 현재 플레이어의 좌표를 나타내는 Vector2Int
- visitedCoordinates : 방문한 좌표를 저장하는 리스트
미니맵 구현에 필요한 Methods
public void CreatMinimap()
{
miniRoomPrefab = Main.Resource.GetObject("MinimapCell");
cellWidth = miniRoomPrefab.GetComponent<RectTransform>().rect.size.x * transform.localScale.x;
cellHeight = miniRoomPrefab.GetComponent<RectTransform>().rect.size.y * transform.localScale.y;
var dungeonRooms = Main.Game.Dungeon.RoomArray;
miniRoomArray = new GameObject[dungeonRooms.GetLength(0), dungeonRooms.GetLength(1)];
foreach (Room room in dungeonRooms)
{
if (room != null)
{
var miniRoomCell = Instantiate(miniRoomPrefab, miniRoomContainer);
miniRoomArray[room.Coordinate.x, room.Coordinate.y] = miniRoomCell;
int x = room.Coordinate.y - dungeonRooms.GetLength(0) / 2;
int y = room.Coordinate.x - dungeonRooms.GetLength(0) / 2;
miniRoomCell.GetComponent<RectTransform>().localPosition = new Vector2(x * cellWidth, y * cellHeight);
SetMiniMapIcon(miniRoomCell.transform.GetChild(0).GetComponent<Image>(), room.RoomType);
}
}
currentPlayerCoordinate = new Vector2Int(Main.Game.Dungeon.CurrentRoom.Coordinate.x, Main.Game.Dungeon.CurrentRoom.Coordinate.y);
}
- miniRoomPrefab을 리소스 매니저에서 로드하고 미니맵 셀의 크기를 계산한다
- 현재 던전의 방 배열을 가져와 각 방에 대한 미니맵 셀을 생성한다
- 각 방에 대한 정보를 표시하고 SetMinimapIcon을 통해 해당 방의 아이콘을 설정해 준다
- 현재 방의 좌표를 UpdateMinimap에 값을 반영해 주도록 currentPlayerCoordinate에 저장한다
미니맵 업데이트
public void UpdateMinimap(Vector2Int MoveDirection)
{
visitedCoordinates.Add(currentPlayerCoordinate);
currentPlayerCoordinate.x += MoveDirection.y;
currentPlayerCoordinate.y += MoveDirection.x;
miniRoomContainer.transform.localPosition -= new Vector3(MoveDirection.x * cellWidth, MoveDirection.y * cellHeight, 0);
}
- 이동 방향에 따라 currentPlayerCoordinate를 업데이트하고, visitedCoordinates에 현재 좌표를 추가
- miniRoomContainer의 위치를 조정하여 현재 플레이어 위치를 가운데로 미니맵을 업데이트
구현 결과
'Unity > UI' 카테고리의 다른 글
유니티 노치 디자인 & 펀치홀 디스플레이 대응 (0) | 2024.03.01 |
---|---|
유니티 UI 롱 버튼 구현 (0) | 2024.02.06 |
유니티 UI 참석 인원 표시 (0) | 2023.11.27 |
유니티 UI 캐릭터 정보 변경 (0) | 2023.11.27 |
유니티 UI 캐릭터 선택 창 (0) | 2023.11.26 |