최종프로젝트 진행상황
오늘의 작업 :
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);