기존코드
private void RefreshMap()
{
foreach (var icon in _roomIcons)
{
Destroy(icon.gameObject);
}
_roomIcons.Clear();
foreach (var room in _floorManager.State.TotalRooms)
{
room.IsDiscovered = true; // 임시로 전체 표시
}
Vector2Int playerCell = _floorManager.CurEnteredRoom.Cell;
float centerX = panel.rect.width * 0.5f;
float centerY = panel.rect.height * 0.5f;
foreach (var room in _floorManager.State.TotalRooms)
{
if (!room.IsDiscovered)
{
continue;
}
Vector2Int offsetFromPlayer = room.Cell - playerCell;
float sizeX = (room.RoomBounds.size.x / _standardRoomSize.x) * _roomCellSpacing;
float sizeY = (room.RoomBounds.size.y / _standardRoomSize.y) * _roomCellSpacing;
float uiPosX = offsetFromPlayer.x * _roomCellSpacing + centerX;
float uiPosY = offsetFromPlayer.y * _roomCellSpacing + centerY;
Vector2 uiPosition = new(uiPosX, uiPosY);
Vector2 uiSize = new(sizeX, sizeY);
bool isCurrentRoom = room == _floorManager.CurEnteredRoom;
var newIcon = Instantiate(roomIconPrefab, panel);
newIcon.Init(room, this, isCurrentRoom, uiPosition, uiSize);
// int cellSizeX = (int)room.RoomBounds.size.x / (int)_roomSize.x;
// room.RoomBounds.size / _roomSize;
// _roomCellSpacing * cellSizeX
// 비율 반영 시
// float sizeX = room.RoomSize.x * 5f;
// float sizeY = room.RoomSize.y * 5f;
/*float cellWidth = room.IsBig ? 210f : 105f;
float cellHeight = room.IsBig ? 210f : 105f;
rt.anchoredPosition = new Vector2(uiX, uiY);
rt.sizeDelta = new Vector2(cellWidth, cellHeight);*/
// newIcon.GetComponentInChildren<Button>()?.onClick.AddListener(() => { OnClickRoom(room); });
// Logger.Log("CLICK!");
_roomIcons.Add(newIcon);
}
}
제약 추가 중
기존 코드
foreach (var room in _floorManager.State.TotalRooms)
{
if (!room.IsDiscovered)
{
continue;
}
Vector2Int offsetFromPlayer = room.Cell - playerCell;
bool isBigRoom =
room.RoomBounds.size.x >= _standardRoomSize.x * 1.9f &&
room.RoomBounds.size.x <= _standardRoomSize.x * 2.1f &&
room.RoomBounds.size.y >= _standardRoomSize.y * 1.9f &&
room.RoomBounds.size.y <= _standardRoomSize.y * 2.1f;
float roomRatio = isBigRoom ? 2f : 1f;
float iconSize = _roomCellSpacing * roomRatio;
// float ratioX = room.RoomBounds.size.x / _standardRoomSize.x;
// float ratioY = room.RoomBounds.size.y / _standardRoomSize.y;
Debug.LogError(room.RoomBounds.size.x);
Debug.LogError(_standardRoomSize);
float uiPosX = offsetFromPlayer.x * _roomCellSpacing * 1f + centerX;
float uiPosY = offsetFromPlayer.y * _roomCellSpacing * 1f + centerY;
if (isBigRoom)
{
uiPosX += _roomCellSpacing * 0.5f;
uiPosY += _roomCellSpacing * 0.5f;
}
Vector2 uiPosition = new(uiPosX, uiPosY);
// Vector2 uiSize = new Vector2(_roomCellSpacing * ratioX, _roomCellSpacing * ratioY);
bool isCurrentRoom = room == _floorManager.CurEnteredRoom;
MapRoomIcon newIcon = Instantiate(roomIconPrefab as MapRoomIcon, panel);
newIcon.Init(room, this, isCurrentRoom, uiPosition, roomRatio);
Logger.LogError($"방이름: {room.name}, bigRoom: {isBigRoom}, Ratio: {roomRatio}, World: {room.RoomBounds.size}, IconSize: {iconSize}, Pos: {uiPosition}");
_roomIcons.Add(newIcon);
}
리팩토링 진행
- 방 아이콘을 매번 Instantiate 하고 Destroy 하지 않음.
- 방 아이콘을 Canvas에 미리 배치하고, 처음에 비활성화 상태로 유지.
- 각 방의 실제 Bounds.Center 월드 좌표를 Canvas 좌표로 변환하여 위치 조정.
- 큰 방은 Bounds 사이즈를 기준으로 크기를 조정.
- 발견한 방만 활성화, 미발견 방은 비활성화 상태로 유지.
- 발견한 방을 관리하는 별도의 리스트 필요.
- 방 입장 시 새롭게 방을 활성화하고 상태를 갱신하는 방식으로 진행.
기존 코드
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class EntiremapUI: BaseUI
{
public override CanvasLayer Layer => CanvasLayer.StagePopup;
[SerializeField] private RectTransform panel;
[SerializeField] private MapRoomIcon roomIconPrefab;
private FloorManager _floorManager;
private List<MapRoomIcon> _roomIcons = new();
private float _roomcellSize = 70f;
private float _roomSpacing = 8f;
public float CellSize => _roomcellSize;
private Vector2 _standardRoomSize = new(18, 13);
public override void Enable()
{
gameObject.SetActive(true);
}
public override void Disable()
{
gameObject.SetActive(false);
}
public void Init(FloorManager floorManager)
{
_floorManager = floorManager;
}
public void RefreshMap()
{
foreach (var icon in _roomIcons)
{
Destroy(icon.gameObject);
}
_roomIcons.Clear();
Vector2Int playerCell = _floorManager.CurEnteredRoom.Cell;
float centerX = panel.rect.center.x;
float centerY = panel.rect.center.y;
foreach (var room in _floorManager.State.TotalRooms)
{
if (!room.IsDiscovered)
continue;
bool isBigRoom = room.RoomBounds.size.x > _standardRoomSize.x * 1.4f
&& room.RoomBounds.size.y > _standardRoomSize.y * 1.1f;
float roomRatio = isBigRoom ? 2f : 1f;
Vector2Int offsetFromPlayer = room.Cell - playerCell;
float uiPosX = offsetFromPlayer.x * (_roomcellSize + _roomSpacing) + centerX;
float uiPosY = offsetFromPlayer.y * (_roomcellSize + _roomSpacing) + centerY;
if (isBigRoom)
{
uiPosX += _roomcellSize * 0.5f;
uiPosY += _roomcellSize * 0.5f;
}
Vector2 uiPosition = new(uiPosX, uiPosY);
Vector2 uiSize = Vector2.one * _roomcellSize * roomRatio;
bool isCurrentRoom = room == _floorManager.CurEnteredRoom;
MapRoomIcon newIcon = Instantiate(roomIconPrefab as MapRoomIcon, panel);
newIcon.Init(room, this, isCurrentRoom, uiPosition, uiSize);
_roomIcons.Add(newIcon);
}
}
public void TeleportToRoom(BaseRoom room)
{
if (!room.IsCleared)
{
return;
}
var player = _floorManager.Player;
player.transform.position = room.TPPoint.position;
room.EnterRoom(player);
gameObject.SetActive(false);
}
}