icon안동민 개발노트

저장 및 로드 기본 구현


 게임 데이터의 저장 및 로드는 거의 모든 게임에서 필수적인 기능입니다.

 언리얼 엔진의 블루프린트 시스템을 사용하면 복잡한 저장 및 로드 기능을 비교적 쉽게 구현할 수 있습니다.

세이브 게임 객체 생성

  1. 콘텐츠 브라우저에서 우클릭
  2. 'Blueprint Class' 선택 후 'Save Game' 선택
  3. 세이브 게임 클래스 이름 지정 (예 : BP_MySaveGame)

저장할 데이터 정의

 세이브 게임 객체 내에 저장하고자 하는 변수들을 정의합니다.

BP_MySaveGame
Variables:
  - PlayerName (String)
  - PlayerLevel (Integer)
  - PlayerHealth (Float)
  - PlayerInventory (Array of S_InventoryItem)
  - CurrentMissionID (Integer)

데이터 저장 방법

  1. 세이브 게임 객체 생성
  2. 데이터 설정
  3. 세이브 게임 객체 저장

 예 : 플레이어 데이터 저장

Function: SavePlayerData
[Create Save Game Object] --> [Set Player Data]
                          --> [Save Game to Slot]
                                    |
              [Print "Game Saved"] <-- [Success]
                                    |
                [Print "Save Failed"] <-- [Failure]
 
Set Player Data:
[Set PlayerName]
[Set PlayerLevel]
[Set PlayerHealth]
[Set PlayerInventory]
[Set CurrentMissionID]

저장된 데이터 로드 방법

  1. 세이브 게임 객체 로드
  2. 데이터 검색 및 적용

 예 : 플레이어 데이터 로드

Function: LoadPlayerData
[Load Game from Slot] --> [Branch: Valid?]
                             |
         [Apply Player Data] <-- [True]
                             |
   [Print "Load Failed"] <-- [False]
 
Apply Player Data:
[Set Player Name]
[Set Player Level]
[Set Player Health]
[Set Player Inventory]
[Set Current Mission]

다중 세이브 슬롯 관리

 여러 개의 세이브 파일을 관리하려면 고유한 슬롯 이름을 사용합니다.

Variables:
  - SaveSlots (Array of String)
 
Function: SaveToSlot
Input: SlotName (String)
[Create Save Game Object] --> [Save Game to Slot]
                          --> [Add Slot to SaveSlots]
 
Function: LoadFromSlot
Input: SlotName (String)
[Load Game from Slot] --> [Apply Data if Valid]
 
Function: DisplaySaveSlots
[Get SaveSlots] --> [Create UI List]
                --> [Bind Load Function to Selection]

자동 저장 기능 구현

 주기적으로 또는 특정 이벤트 발생 시 자동으로 저장하는 기능을 구현할 수 있습니다.

Event BeginPlay
    |
[Start Auto Save Timer]
 
Function: AutoSave
[Check Auto Save Condition] --> [Branch]
                                  |
                    [SavePlayerData] <-- [True]
 
Event OnLevelCompleted
    |
[SavePlayerData]

저장 데이터 암호화 기본 개념

 민감한 데이터를 보호하기 위해 기본적인 암호화를 적용할 수 있습니다.

  1. 저장 전 데이터 암호화
  2. 로드 후 데이터 복호화
Function: EncryptData
Input: PlainData (String)
[Convert to Bytes] --> [XOR with Key] --> [Convert to Base64]
 
Function: DecryptData
Input: EncryptedData (String)
[Decode Base64] --> [XOR with Key] --> [Convert to String]

 주의 : 이는 기본적인 보안 조치일 뿐이며, 중요한 데이터의 경우 더 강력한 암호화 방식을 사용해야 합니다.

일반적인 문제와 해결 방법

 1. 데이터 손상

  • 문제 : 저장 중 게임 종료로 인한 데이터 손상
  • 해결 : 임시 파일에 먼저 저장 후 성공 시 실제 파일로 이동

 2. 버전 호환성

  • 문제 : 게임 업데이트로 인한 세이브 파일 구조 변경
  • 해결 : 세이브 파일에 버전 정보 포함 및 마이그레이션 로직 구현

 3. 대용량 데이터 처리

  • 문제 : 큰 세이브 파일로 인한 저장/로드 시간 증가
  • 해결 : 데이터 압축 및 비동기 저장/로드 구현
Function: AsyncSaveGame
[Create AsyncTask] --> [Save Game in Task]
                   --> [Notify on Completion]
 
Function: AsyncLoadGame
[Create AsyncTask] --> [Load Game in Task]
                   --> [Apply Data on Completion]

효율적인 저장 시스템 설계 팁

 1. 모듈화

  • 각 시스템(인벤토리, 퀘스트 등)별로 저장/로드 함수 분리
  • 중앙 저장 관리자를 통한 전체 프로세스 조정

 2. 증분 저장

  • 변경된 데이터만 저장하여 저장 시간 및 용량 최적화

 3. 데이터 검증

  • 로드 시 데이터 유효성 검사 및 복구 메커니즘 구현

 4. UI 통합

  • 저장/로드 프로세스와 연동된 사용자 친화적 UI 설계

 5. 클라우드 저장 고려

  • 플랫폼 제공 클라우드 저장 서비스 통합 검토

예제 : 퀘스트 및 인벤토리 저장

BP_AdvancedSaveGame
Variables:
  - PlayerData (S_PlayerData)
  - QuestData (Array of S_QuestInfo)
  - InventoryData (Array of S_ItemData)
 
Function: SaveGameState
[Collect Player Data] --> [Collect Quest Data]
                      --> [Collect Inventory Data]
                      --> [Encrypt Sensitive Data]
                      --> [Save to File]
                      --> [Update Cloud Save]
 
Function: LoadGameState
[Load from File] --> [Decrypt Data]
                 --> [Verify Data Integrity]
                 --> [Apply Player Data]
                 --> [Restore Quests]
                 --> [Restore Inventory]
 
Function: MigrateOldSaveFile
[Check Save Version] --> [Branch: Need Migration?]
                           |
            [Apply Migration Logic] <-- [True]
                           |
               [Load as Normal] <-- [False]

 이 고급 예제는 플레이어 데이터, 퀘스트 상태, 인벤토리 정보를 포함하는 복잡한 저장 시스템을 구현합니다.

 데이터 암호화, 버전 관리, 그리고 클라우드 저장 기능까지 고려하고 있습니다.

 블루프린트를 사용한 저장 및 로드 시스템 구현은 게임의 복잡성과 요구사항에 따라 다양한 형태로 발전할 수 있습니다.

 기본적인 데이터 저장부터 시작하여 암호화, 비동기 처리, 클라우드 통합 등의 고급 기능을 단계적으로 추가하는 것이 좋습니다.

 항상 데이터의 일관성과 보안을 최우선으로 고려하며, 사용자 경험을 해치지 않는 선에서 효율적인 저장 및 로드 프로세스를 설계해야 합니다.