TIL_240214

Z_제트·2024년 2월 14일
0

TODAY I LEARNED

목록 보기
74/88
post-thumbnail

to do_오늘 할 일

  • 최종프로젝트 ing

retro_오늘 한 일(회고)

최종프로젝트 진행상황

오늘의 작업 :

  • 유닛, 룸, 아이템 업그레이드 UI 및 시스템 추가 ing
    • still 유닛 작업 중..

유닛 업그레이드 구현

GameManager.cs

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

RemoveUnit() 하게 되면
(유닛이 배치되어 있다면)배치되어 있는 유닛 해제,
인벤토리에서도 삭제,
그리고 유닛에 아이템 장착되어있다면 아이템 장착해제 진행한다.

public void RemoveUnit(Character unit) // unit
{
    if (unit.CurRoom != null) // 유닛이 배치되어있는 경우에
    {
        ((BatRoom)unit.CurRoom).DeleteUnit(unit); // 배치되어있는 유닛 빼면서
    }
    playerUnits.Remove(unit); // 인벤토리에서도 지우고 
    Item[] items = unit.Item; // 아이템 장착되어있는 것도 빼주고
    for (int i = 0; i < items.Length; i++)
    {
        if (items[i] != null)
        {
            items[i].IsEquiped = false;
            items[i].Owner = null;
        }
    }
}

InventUpgrade_PopupUI.cs

먼저, UpgradeUnitSlots 배열로 slot 을 관리한다.
slot 이 얼마나 찼는지 체크해주는 역할의 Count 는 Init() 에서 0 으로 초기화 진행.

private Character[] UpgradeUnitSlots = new Character[3];
public int Count { get; private set; } // slot 얼마나 찼는지 체크해주는 역할.

ClickUpgradeBtn() 메서드에서는
업그레이드 버튼을 눌렀을 때
slot 이 null 인 경우 예외처리 진행하고,
slot 3칸에 모두 동일한 데이터가 들어왔다면 업그레이드 진행.
-> 이 때 업그레이드 후 새롭게 능력 부여된 유닛 제공을 위해 Data 의 NextKey 활용. (e.g. 1레벨의 Gun 이 NextKey 로 다음 레벨 Gun 인 Guner 를 string 으로 들고 있게 한다 !)

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

    // 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
    {
        Debug.Log("동일한 아이템을 넣어주세요!");
    }
}

slot 클릭하면 작동하는 ClickSlot() 메서드.
슬롯 클릭하면 데이터가 빠지기 때문에, Count-- 도 진행.

private void ClickSlot(int i)
{
    if (UpgradeUnitSlots == null) return;
    Count--;
    UpgradeUnitSlots[i] = null;

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

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

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

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

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

public void AddUpgradeUnitSlot(Character unit)
{
    int index = -1; // 비어있는 배열 요소의 index 찾았는지 아닌지 판별을 위한 친구. (못찾았다면 -1)

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

        }

        if (UpgradeUnitSlots[i] == unit) // 똑같은 친구가 있으면 return.
        {
            return;
        }
    }

    if (index == -1) // UpgradeUnitSlots 배열이 꽉 차있다면 return.
    {
        return;
    }

    UpgradeUnitSlots[index] = unit;
    SetUnitInfo(index);
    Count++;
}

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

--
그리고
업그레이드 시 Key 값과 매칭되는 prefab 이 없어서 에러가 뜨는 이슈가 있었는데
csv 파일에 PrefabName 키값을 새로 추가해서 prefab 만들 때 더이상 Key 가 아닌 PrefabName 을 바라보게 설정했다.
(이렇게 하면 굳이 똑같이 생긴 prefab 을 각 레벨별로 만들어 줄 필요도 없고, csv 파일에서는 Key 값으로 데이터 구분도 할 수 있음 !)

before
Units[index] = Main.Get<SceneManager>().Scene.CreateCharacter(data.Data.Key);
after
Units[index] = Main.Get<SceneManager>().Scene.CreateCharacter(data.Data.PrefabName);


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

0개의 댓글