[25.07.23] :: 가디언 앤 시커 프로젝트 22

chooha·2025년 7월 23일

가디언앤시커

목록 보기
22/25

📝 개발일지 - 플레이어 룬 인벤토리 시스템 구현

👨‍💻 오늘의 개발 작업

오늘은 아케인 보드 시스템의 룬 인벤토리를 개선하는 작업을 진행했음

기존에는 모든 룬(1~16번)을 하드코딩으로 인벤토리에 표시하고 있었는데, 이를 플레이어가 실제로 소유한 룬만 표시하도록 변경했음

게임에서 승리했을 때 룬을 획득하고, 소유한 룬만 아케인 보드 UI에 나타나도록 하는 시스템을 설계하고 구현했음


💡 오늘의 5분 기록

1. 문제 확인 - 하드코딩된 룬 생성 시스템

기존 UGS_RuneInventoryWidget::InitInven에서 모든 룬을 무조건 생성하고 있었음

문제가 된 기존 코드:

// 테스트 용 - 모든 룬을 하드코딩으로 생성
for (uint8 RuneID=1; RuneID <=16; ++RuneID)
{
    FRuneTableRow RuneData;
    if (BoardManager->GetRuneData(RuneID, RuneData))
    {
        // 룬 위젯 생성...
    }
}

문제점들:

  • 플레이어가 소유하지 않은 룬도 모두 표시됨
  • 게임 진행에 따른 룬 획득 시스템이 없음
  • 테스트용 코드가 그대로 남아있어서 게임 밸런스 파괴

2. 설계 과정 - 룬 인벤토리 관리 위치 결정

고려했던 3가지 옵션:
1. UGS_ArcaneBoardManager에 플레이어 인벤토리 추가
2. 별도의 UGS_PlayerRuneInventoryManager 생성
3. UGS_ArcaneBoardLPS에서 직접 관리

최종 선택: UGS_ArcaneBoardLPS

  • 이미 전체 룬 시스템의 진입점 역할
  • 게임 승리 → 룬 획득 로직과 자연스럽게 연결
  • 저장/로드 시스템을 이미 관리하고 있어서 확장이 용이
  • 캐릭터 클래스별 분리된 데이터 관리 가능

3. 핵심 구현 내용

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_ArcaneBoardSaveGameTSet<uint8> OwnedRuneIDs 추가
  • 배치 정보와 함께 소유한 룬 목록도 저장/로드

4. 데이터 플로우 개선

기존 플로우:
위젯 열림 → 모든 룬 하드코딩 생성 → 표시

개선된 플로우:
게임 승리 → 룬 획득 → LPS 인벤토리 업데이트 → 저장
위젯 열림 → LPS에서 소유 룬 조회 → 해당 룬들만 생성 → 표시

5. 성과와 깨달은 점

달성한 것들:

  • 플레이어 룬 소유 시스템 구축 완료
  • 기존 코드 변경 최소화하면서 깔끔하게 확장
  • 저장/로드 시스템까지 일관성 있게 통합
  • 테스트용 룬 지급 시스템으로 개발 편의성 확보

설계에서 배운 점:

  • 기존 시스템의 아키텍처를 잘 분석해서 자연스러운 확장점을 찾는 것이 중요
  • 수량 관리가 필요없는 단순한 소유 여부만 관리하면 되니까 TSet<uint8>이 최적
  • UI는 데이터를 표시만 하고, 실제 데이터 관리는 상위 시스템에서 하는 것이 깔끔함

🔧 향후 개선 계획

1. SaveGame 로컬 저장 문제 해결

현재 문제점:

  • 클라이언트 측 데이터 조작이나 치팅 위험성 존재
  • 서버-클라이언트 간 데이터 불일치 문제

개선 방향:

  • 서버 측 플레이어 데이터베이스에 룬 인벤토리 저장
  • 클라이언트는 캐싱용으로만 사용하고, 실제 데이터는 서버에서 관리
  • 게임 시작 시 서버에서 최신 룬 데이터 동기화하는 로직 추가

2. 실제 게임 승리 시 룬 획득 시스템

구현해야 할 기능들:

  • 게임 모드별 룬 보상 테이블 설계 (생존 시간, 킬 수, 미션 완료 등에 따른 차등 보상)
  • 시커 승리 조건 달성 시 AddRuneToInventory() 호출하는 게임 로직 연동
  • 룬 획득 시 UI 알림 시스템 (새로운 룬을 얻었다는 팝업이나 이펙트)
  • 중복 룬 획득 방지 로직 (이미 소유한 룬은 다른 보상으로 대체)

예상 구현 위치:

  • 게임 결과 처리하는 GameMode나 GameState에서 승리 판정 후 LPS의 AddRuneToInventory() 호출
  • 룬 보상 정책은 별도 DataTable로 관리해서 기획자가 쉽게 수정 가능하도록 구성

0개의 댓글