오늘은 아케인 보드 시스템의 룬 인벤토리를 개선하는 작업을 진행했음
기존에는 모든 룬(1~16번)을 하드코딩으로 인벤토리에 표시하고 있었는데, 이를 플레이어가 실제로 소유한 룬만 표시하도록 변경했음
게임에서 승리했을 때 룬을 획득하고, 소유한 룬만 아케인 보드 UI에 나타나도록 하는 시스템을 설계하고 구현했음
기존 UGS_RuneInventoryWidget::InitInven에서 모든 룬을 무조건 생성하고 있었음
문제가 된 기존 코드:
// 테스트 용 - 모든 룬을 하드코딩으로 생성
for (uint8 RuneID=1; RuneID <=16; ++RuneID)
{
FRuneTableRow RuneData;
if (BoardManager->GetRuneData(RuneID, RuneData))
{
// 룬 위젯 생성...
}
}
문제점들:
고려했던 3가지 옵션:
1. UGS_ArcaneBoardManager에 플레이어 인벤토리 추가
2. 별도의 UGS_PlayerRuneInventoryManager 생성
3. UGS_ArcaneBoardLPS에서 직접 관리
최종 선택: UGS_ArcaneBoardLPS
UGS_ArcaneBoardLPS에 추가된 기능들:
// 소유한 룬 ID들을 저장
TSet<uint8> OwnedRuneIDs;
// 게임 승리 시 룬 획득
void AddRuneToInventory(uint8 RuneID);
// UI 초기화용 - 소유한 룬 목록 반환
TArray<uint8> GetOwnedRunes() const;
// 개발/테스트용 기본 룬 지급
void InitializeTestRunes();
RuneInventoryWidget 초기화 로직 변경:
// 기존: 하드코딩된 1~16 룬 생성
for (uint8 RuneID=1; RuneID <=16; ++RuneID)
// 개선: LPS에서 소유한 룬만 조회해서 생성
TArray<uint8> OwnedRunes = ArcaneBoardLPS->GetOwnedRunes();
for (uint8 RuneID : OwnedRunes)
저장 시스템 확장:
UGS_ArcaneBoardSaveGame에 TSet<uint8> OwnedRuneIDs 추가기존 플로우:
위젯 열림 → 모든 룬 하드코딩 생성 → 표시
개선된 플로우:
게임 승리 → 룬 획득 → LPS 인벤토리 업데이트 → 저장
위젯 열림 → LPS에서 소유 룬 조회 → 해당 룬들만 생성 → 표시
달성한 것들:
설계에서 배운 점:
TSet<uint8>이 최적현재 문제점:
개선 방향:
구현해야 할 기능들:
AddRuneToInventory() 호출하는 게임 로직 연동예상 구현 위치:
AddRuneToInventory() 호출