세이브 로드 구조 정리

세이브 로드 시스템은 UKOSaveGame에 저장 데이터를 모아두고, UKOSaveSubsystem에서 저장과 로드를 처리하는 방식으로 구현했다.

저장 대상 저장 내용
플레이어 위치, 회전
인벤토리 슬롯 아이템 정보
장비 장착 무기, 방어구
설비 설비 종류, 위치, 그리드 점유 정보
설비 내부 상태 선택 레시피, 입력/출력 버퍼, 제작 진행률
연료 설비 연료 아이템, 연료 개수, 연료 소모 상태
보스 생존 여부, 위치, 체력, 전투 상태
몬스터 처치 여부 또는 현재 상태
채집물 이미 획득했는지 여부

액터 자체를 저장하는 것이 아니라, 다시 복원할 수 있는 데이터만 저장한다.


저장 흐름

저장 흐름은 모든 대상이 거의 동일하다.

현재 월드 상태 확인
→ 저장할 대상 순회
→ 대상의 고유 ID 확인
→ 필요한 상태값 저장
→ SaveGame 슬롯에 기록

“이 객체를 나중에 다시 같은 상태로 만들기 위해 필요한 최소한의 정보가 무엇인가?”를 기준으로 저장 데이터를 정리했다.


로드 흐름

로드할 때는 단순히 값을 다시 넣는 것이 아니라, 월드를 저장 당시 상태에 맞게 다시 구성해야 했다.

저장 파일 확인
→ 저장 데이터 불러오기
→ 플레이어 상태 복원
→ 인벤토리와 장비 복원
→ 기존 설비 상태 정리
→ 저장된 설비 다시 스폰
→ 그리드 점유 정보 복원
→ 설비 내부 상태 복원
→ 보스 상태 복원
→ 몬스터 상태 복원
→ 채집물 획득 여부 반영

특히 설비는 기존 월드에 남아 있는 액터와 저장된 액터가 겹칠 수 있기 때문에, 기존 설비를 제거하고 저장 데이터 기준으로 다시 생성하는 방식으로 처리했다.

반면 보스, 몬스터, 채집물처럼 맵에 이미 배치되어 있는 액터들은 저장된 상태를 기준으로 활성화하거나 비활성화하는 방식으로 복원했다.


구현하면서 중요했던 부분

저장 대상을 하나씩 따로 보는 것이 아니라, 공통된 흐름으로 정리하였다.

모든 저장 대상은 다음 구조를 가진다.

  • 고유 ID가 있는가
  • 현재 상태가 무엇인가
  • 로드할 때 다시 복원할 수 있는가

이 기준으로 보면 설비, 보스, 몬스터, 채집물은 모두 같은 방식으로 다룰 수 있다.

설비는 FactoryId로 다시 스폰하고, 보스와 몬스터는 저장된 생존 상태를 기준으로 복원한다. 채집물은 획득 여부를 저장해 로드 후 다시 나타날지 결정한다.


정리

플레이어, 인벤토리, 장비처럼 플레이어에게 직접 연결된 데이터뿐만 아니라, 설치된 설비, 보스, 몬스터, 채집물처럼 월드에 존재하는 객체들의 상태까지 함께 저장했다.

이를 통해 로드했을 때 플레이어가 어디에 있었는지뿐만 아니라, 어떤 설비를 설치했는지, 어떤 보스를 처치했는지, 어떤 몬스터가 사라졌는지, 어떤 채집물을 이미 획득했는지까지 유지할 수 있게 되었다.