TIL_240215

Z_제트·2024년 2월 15일
0

TODAY I LEARNED

목록 보기
75/88
post-thumbnail

to do_오늘 할 일

  • 최종프로젝트 ing

retro_오늘 한 일(회고)

최종프로젝트 진행상황

오늘의 작업 :

  • 유닛, 룸, 아이템 업그레이드 UI 및 시스템 추가 ing
    • 유닛은 어느정도 마무리 단계. 룸 업그레이드 작업 gogo !

룸 업그레이드 구현

GameManager.cs

원래는 Upgrade 버튼 누를 때나 인벤토리에서 삭제버튼 누를 때 GameManager 에 있는 PlayerRooms 을 직접적으로 불러서 수정을 해왔는데,
이제는 GameManager 에 RemoveRoom() 메서드를 만들어서

RemoveRoom() 하게 되면
(룸이 배치되어 있다면)배치되어 있는 룸 해제, - unit 도 자연스럽게 빠짐. (BatRoom의 DeleteAllUnit()이 OnDestroy() 에서 발동된다.)
인벤토리에서도 삭제가 진행된다.

private TileManager _tile;

public void RemoveRoom(Room room) // room
{
    if (room.IsEquiped) // 배치되어있다면 room 해제
    {
        room.IsEquiped = false;
        _tile.DeleteRoom(room);
    }
    PlayerRooms.Remove(room); // 인벤토리에서 지우고
}

TileManager.cs

public void DeleteRoom(Room room)
{
    RoomBehavior newRoom = CreateDefaultRoom(room.IndexX, room.IndexY, _roomObjList[room.IndexX][room.IndexY].transform.position);
    resource.Destroy(_roomObjList[room.IndexX][room.IndexY].gameObject);
    _roomObjList[room.IndexX][room.IndexY] = newRoom;
}

InventUpgrade_PopupUI.cs

Unit 과 동일하게 먼저, UpgradeRoomSlots 배열로 slot 을 관리한다.

private Room[] UpgradeRoomSlots = new Room[3];

ClickUpgradeBtn()에서
Unit slot 에 데이터 들어왔을 때와 Room slot 에 데이터가 들어왔을 때의 구분을 위해 다음의 조건을 추가해주었다.

if (UpgradeUnitSlots[0] != null && UpgradeUnitSlots[1] != null && UpgradeUnitSlots[2] != null) // Unit slot 구분
if (UpgradeRoomSlots[0] != null && UpgradeRoomSlots[1] != null && UpgradeRoomSlots[2] != null) // Room slot 구분

작동은 잘 되는데, 과연 올바르게 조건을 걸어준건지는 확실하진 않다 하핫.

private void ClickUpgradeBtn(PointerEventData data)
{
    // slot 이 null 인 경우 예외처리할 것
    if (_upgradeSlotsImgs[0].sprite == null || _upgradeSlotsImgs[1].sprite == null || _upgradeSlotsImgs[2].sprite == null)
    {
        Error_PopupUI ui = Main.Get<UIManager>().OpenPopup<Error_PopupUI>("Error_PopupUI");
        ui.curErrorText = "슬롯이 비어있습니다!";
        Debug.Log("슬롯이 비어있습니다!");
        return;
    }

    if (UpgradeUnitSlots[0] != null && UpgradeUnitSlots[1] != null && UpgradeUnitSlots[2] != null) // Unit slot 구분
    {
        // slot 3개에 모두 동일한 데이터가 들어왔다면.
        if (UpgradeUnitSlots[0].Data.Key == UpgradeUnitSlots[1].Data.Key && UpgradeUnitSlots[1].Data.Key == UpgradeUnitSlots[2].Data.Key)
        {
            for (int i = 0; i < UpgradeUnitSlots.Length; i++)
            {
                _upgradeSlotsImgs[i].sprite = null; // slot image 빼기.
                _upgradeSlotsImgs[i].enabled = false; // image 컴포넌트 체크 해제.

                Main.Get<GameManager>().RemoveUnit(UpgradeUnitSlots[i]);
                Owner.SetUnitInventory();
            }

            // 합성 후 새롭게 능력 부여된 아이템 제공 - NextKey 통해.
            Main.Get<GameManager>().playerUnits.Add(new Character(Main.Get<DataManager>().Character[UpgradeUnitSlots[0].Data.NextKey]));
            Owner.SetUnitInventory();

            Array.Clear(UpgradeUnitSlots, 0, UpgradeUnitSlots.Length);
            Count = 0;
        }
        else
        {
            Error_PopupUI ui = Main.Get<UIManager>().OpenPopup<Error_PopupUI>("Error_PopupUI");
            ui.curErrorText = "동일한 종류,\n레벨의 유닛을 넣어주세요!";
            Debug.Log("동일한 유닛을 넣어주세요!");
        }
    }

    if (UpgradeRoomSlots[0] != null && UpgradeRoomSlots[1] != null && UpgradeRoomSlots[2] != null) // Room slot 구분
    {
        // slot 3개에 모두 동일한 데이터가 들어왔다면.
        if (UpgradeRoomSlots[0].Data.Key == UpgradeRoomSlots[1].Data.Key && UpgradeRoomSlots[1].Data.Key == UpgradeRoomSlots[2].Data.Key)
        {
            for (int i = 0; i < UpgradeRoomSlots.Length; i++)
            {
                _upgradeSlotsImgs[i].sprite = null; // slot image 빼기.
                _upgradeSlotsImgs[i].enabled = false; // image 컴포넌트 체크 해제.

                Main.Get<GameManager>().RemoveRoom(UpgradeRoomSlots[i]);
                Owner.SetRoomInventory();
            }

            // 합성 후 새롭게 능력 부여된 아이템 제공 - NextKey 통해.
            Main.Get<GameManager>().PlayerRooms.Add(new Room(Main.Get<DataManager>().Room[UpgradeRoomSlots[0].Data.NextKey]));
            Owner.SetRoomInventory();

            Array.Clear(UpgradeRoomSlots, 0, UpgradeRoomSlots.Length);
            Count = 0;
        }
        else
        {
            Error_PopupUI ui = Main.Get<UIManager>().OpenPopup<Error_PopupUI>("Error_PopupUI");
            ui.curErrorText = "동일한 종류,\n레벨의 룸을 넣어주세요!";
            Debug.Log("동일한 룸을 넣어주세요!");
        }
    }
}

ClickSlot() 에서도
Unit slot 과 Room slot 을 구분지어줘야하기 때문에
조건을

if (UpgradeUnitSlots[i] != null)
{
    UpgradeUnitSlots[i] = null;
}
else if (UpgradeRoomSlots[i] != null)
{
    UpgradeRoomSlots[i] = null;
}

이런식으로 추가해주었다.

private void ClickSlot(int i)
{
    if (UpgradeUnitSlots == null || UpgradeRoomSlots == null) return;

    Count--;

    if (UpgradeUnitSlots[i] != null)
    {
        UpgradeUnitSlots[i] = null;
    }
    else if (UpgradeRoomSlots[i] != null)
    {
        UpgradeRoomSlots[i] = null;
    }

    _upgradeSlotsImgs[i].sprite = null; // slot image 빼기
    _upgradeSlotsImgs[i].enabled = false; // image 컴포넌트 체크 해제.
}

AddUpgradeRoomSlot() 메서드
(유닛의 AddUpgradeUnitSlot 과 동일한 구조)

index 는 비어있는 배열 요소의 index 찾았는지 아닌지 판별을 위한 친구. (못찾았다면 -1 유지하겠죠.)

fore 문에서
배열 요소에 아무것도 없으면서 -1 이면 index 를 i 로 변경.
배열 요소에 똑같은 unit 이 들어있다면 return

index 가 -1 이라면, 배열이 꽉 찼다는 의미이기에 return;

for 문에서 두번째 if 문에 안 걸리고 첫번째 if 문만 거쳤다면
index 가 i 가 되어있으니까
UpgradeRoomSlot[index] = unit;
SetRoomInfo(index);
Count++; (슬롯에 더해지는 상황이니까 !)
진행.

public void AddUpgradeRoomSlot(Room room)
{
    int index = -1;

    for (int i = 0; i < UpgradeRoomSlots.Length; i++)
    {
        if (UpgradeRoomSlots[i] == null && index == -1)
        {
            index = i;
        }
        if (UpgradeRoomSlots[i] == room)
        {
            return;
        }
    }

    if (index == -1)
    {
        return;
    }
    UpgradeRoomSlots[index] = room;
    SetRoomInfo(index);
    Count++;
}

이 외에
InventRoom_ContentsBtnUI.cs 에서는 UI 관련 처리 진행.
(e.g. 언제 Upgrade 창이 꺼지고, 켜지고 하는지, Upgrade 창이 켜져있으면 인벤토리 아이템 눌렀을 때 Upgrade slot 에 추가되도록, etc.)


profile
trying to make the world a better place with a cool head and warm heart

0개의 댓글