프로젝트 일지/C#

[C#/TIL] TextRPG 팀 프로젝트 일지

톰마토 2025. 2. 11. 22:04
728x90

오늘 한 것

아이템 & 인벤토리 구현

개인 프로젝트 때 Item과 관련된 Inventory의 구조가 가장 아쉬움이 남아서 해설 강의와 다른 분들의 코드를 보고 배운 것들을 토대로 다시 도전해보고 싶어 팀원분들께 어필(?)해서 도전하게 되었다!

Item을 클래스로 만들고 InventoryManager 에서 관리하였다. 그리고 InventoryScene에서는 Item의 출력 함수와 InventoryManager의 Equip, UnEquip 기능을 활용해서 Scene에서의 코드가 더러워지지 않게(?) 제작했다. 이번에는 나름 깔끔하게 만들어진 것 같다! 😆

장비 장착 -> 장착 해제 -> 재장착 시 플레이어 능력치 음수되는 현상 수정

Scene에서 장착/해제 하는 로직

UnEquip할 때 EquipSlot을 비워줘야 하는데 비워주지 않아 같은 아이템을 다시 장착해도 장착 해제만 실행됨. 그래서 계속 아이템 능력치를 플레이어 능력치에서 차감해주다 보니 음수가 되는 현상이 발생했다.

  • Dictionary<EItemEquipType, Item> EquipSlot

1차 수정 : EquipSlot의 해당 부위에 null을 넣어줬다.

=> 장비 장착 -> 장착 해제 -> 재장착 시 null 참조 오류 뜸 (헉)

2차 수정 : 편안하게 Dictionary에 있는 Remove 함수로 해당 쌍을 제거했다.

=> EquipSlot.Remove(selectedItem.EquipType); // 진짜 해결

인벤토리 페이지 넘기기

인벤토리에서 아이템과 포션을 함께 보여주면서 아이템이 많아도 둘다 잘 보일 수 있게 하기 위해 아이템을 5개씩 보이게 만들고 페이지를 넘기며 볼 수 있도록 했다. 모습은 나중에 마무리로~

page에 해당하는 아이템 인덱스 계산
포션 목록은 10번째 줄부터 출력됨

팀 다같이 한 것

  • 아침 회의 - 아이템 구조 회의, 몬스터 스킬 회의, 개발 진척 공유
  • 3차 역할 분담하여 개발 진행
  • 17:30 미니 회의 - 개발 진척 공유 & 발표자 선정 & 발표 준비 어떻게 할지 약간의 이야기
  • 저녁 회의 - 자잘한 버그 수정 후 main에 Ver2.0 올림 & 남은 할 일 공유 & 개발 데드라인 정함 & 내일 계속 진행할 일과 추가로 진행할 일 일정 계획 
  • 약간의 뿌듯해하는 시간 가지기 

우리는 항상 회의록에 기록을 충분히 남겨서 좋네요~!

알게 된 것 : object to int, object to float는 Convert로.

우리 팀에서는 json파일을 적극 활용해서 게임 데이터들을 관리했다. DataTableManager에서 스테이지 테이블, 아이템 테이블 등의 데이터들을 읽어 json의 키-값에 맞춰 Dictionary 형태로 데이터를 가공해준다. 그 과정에서 json의 value들의 타입을 문자는 string, 숫자는 double 등으로 변환해서 가져오지만, Dictionary에 한 번에 object 타입으로서 저장하게 된다.

  • Dictionary<string, Dictionary<string, object>>

문제 상황

해당 Dictionary에서 받은 double 값을 float로 직접 캐스팅 했더니 예외가 발생한다. object에 저장된 double을 float로 바로 변활할 수 없는 것이다.

Dictionary<string, object> itemInfo = DataTableManager.Instance.GetDBData("item", i);
// object 타입을 float로 직접 캐스팅하는 예시
float maxHp = (float)itemInfo["MaxHp"]; // 예외 발생

object에 저장된 Double을 Single(float)로 바꿀 수 없다는 예외 메세지
무수한 try-catch문의 에러 출력

알게된 점 및 해결 방법

1차 깨달음 : double을 object 타입으로 가지고 있는 거라서 그렇다.

2차 깨달음 : object 타입은 명시적 캐스팅으로 형변환해야 한다. 

 

double을 float나 int, 사용자 정의 enum 타입으로 캐스팅하는 것은 가능하지만, object 타입을 직접 float, int 등으로 캐스팅하는 것이 불가능함.

=> Convert 클래스를 사용해야한다. (Convert.ToInt32(), Convert.ToSingle() 등) 

String은 object.ToString()로 가능한~

수정한 코드

 

728x90