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