Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

언리얼 엔진은 SaveGame이라는 클래스를 통해 게임 데이터를 저장하고 로딩하는 기능을 제공한다.

 

윈도우, 맥, 안드로이드 등 각 플랫폼별로 알맞은 최적의 장소에 데이터가 저장되며, 에디터 모드에서는 Saved/SaveGames 폴더에 .sav 파일로 저장된다.

 

 

CoreMinimal.h를 ArenaBattle.h로 변경한다.

 

 

게임 데이터에 레벨, 경험치, 플레이어 이름, 최고 점수를 저장시킨다.

 

 

각 데이터의 기본값을 지정한다.

  • 이 기본값들은 저장된 게임 데이터가 없을 경우 초깃값으로 사용된다.

 

 

게임 데이터를 저장하고 불러오기 위해서는 고유의 슬롯 이름이 필요하다.

  • 슬롯을 여러 개 만들어 세이브 데이터를 여러 개 만들 수 있다.
  • 각 슬롯은 플레이어 번호를 통해 여러 명의 데이터를 관리할 수도 있다.
  • SlotA[0]: A의 1번 플레이어, SlotA[1]: A의 2번 플레이어, SlotC[1]: C의 2번 플레이어, ...

 

처음에는 세이브 데이터가 없으므로 기본 세이브 데이터를 생성하는 로직을 InitPlayerData() 함수에 구현한다.

  • 각 데이터는 직렬화(Serialization)해 저장할 필요 없이 런타임에 값이 설정되므로 Transient 키워드를 지정한다.

 

 

필요한 헤더를 포함하고 최고 점수 기본값과 슬롯 이름을 지정한다.

 

 

최고 점수의 Getter이다.

 

 

기존 InitPlayerData() 함수의 내용은 주석처리하고 새로 작성한다.

 

UGameplayStatics::LoadGameFromSlot(SlotName, UserIndex) 함수를 실행하면, 해당 슬롯의 UserIndex 플레이어의 게임 데이터를 로드해 USaveGame* 타입으로 반환한다.

  • 처음이라서 저장된 데이터가 없으면 NULL이 반환된다.

 

저장된 데이터가 없으면 기본값을 불러온 후 게임 데이터를 설정한다.

  • GetMutableDefault<T>() 함수는 GetDefault<T>() 함수의 수정 가능 버전이다.
  • CDO를 값의 변경이 가능하도록 반환한다.
  • 여기서 값을 수정하면 클래스의 기본값이 변경된다.

 

 

점수를 증가시킬 때 최고 점수를 갱신한다.

 

 

불러오는 기능을 구현했으니 이제 저장하는 기능을 구현해본다.

 

여기서는 각 게임 데이터가 변경될 때마다 저장하지만, 실제 게임을 제작할 때는 다음과 같이 저장하는 것이 효율적이다.

  • 일정 주기마다 자동으로 저장한다.
  • 저장 메뉴, 체크 포인트를 통해 저장한다.
  • 게임을 종료시킬 때 저장한다.

 

 

NewObject<T>() 함수는 언리얼 오브젝트를 생성하는 함수다.

  • 더 이상 참조되지 않으면 언리얼 런타임 GC에 의해 자동으로 소멸되므로 별도로 delete 키워드를 사용하지 않아도 된다.
  • 단, 월드에 액터를 생성하는 경우에는 추가적으로 고려할 것들이 많으므로 SpawnActor<T>() 함수를 제공하지만 내부적으로는 결국 NewObject<T>() 함수를 사용한다.

 

새로운 세이브 데이터 객체를 만들고 UGameplayStatics::SaveGameToSlot(SlotName, UserIndex) 함수를 통해 게임 데이터를 저장한다.

  • bool 타입의 성공 여부를 반환한다.

 

 

게임 데이터를 불러오고 나서 일단 한 번 저장한다.

  • 처음이라서 세이브된 데이터가 없을 수 있기 때문이다.

 

 

경험치와 점수가 변경될 때마다 게임 데이터를 저장한다.

 

 

에디터 모드에서 게임 데이터는 Saved/SaveGames/{슬롯 이름}.sav 파일에 저장된다.

 

 

HUD UI에서 세이브 게임을 통해 불러온 최고 점수도 갱신하도록 작성해준다.

 

 

SaveGame을 이용해 게임 데이터를 저장하고 불러오는 데 성공했다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그