카테고리 없음

Unity 본캠프 64일차

julesnow 2025. 7. 11. 09:04

 

 

기존코드

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);
    }
}