게임에 내용을 저장해서 나중에 불러오는 기능을 추가해야 한다.
이전 프로젝트에서 구현되어 있는 기능 중에 HP, Level 그리고 Player Location을 저장해보자.
//TOSaveGame.h
#include "Tellours.h"
#include "GameFramework/SaveGame.h"
#include "TOSaveGame.generated.h"
/**
*
*/
UCLASS()
class TELLOURS_API UTOSaveGame : public USaveGame
{
GENERATED_BODY()
public:
UTOSaveGame();
UPROPERTY()
FVector PlayerLocation;
UPROPERTY()
int32 HP;
UPROPERTY()
int32 Level;
};
SaveGame을 상속받는 TOSaveGame C++ 클래스를 생성한 뒤 값을 저장할 변수를 지정한다.
//TOSaveGame.cpp
#include "TOSaveGame.h"
UTOSaveGame::UTOSaveGame()
{
PlayerLocation = FVector(FVector(-970.0f, -346.4f, 222.46f));
HP = 10;
Level = 1;
}
이 후 기본 값을 생성해준다.
여기서 Location 벡터 값은 현재 테스트 맵에서 사용하는 위치 값을 사용했지만, 초기화를 원한다면 FVector(FVector::ZeroVector)을 사용해도 무방하다.
이 값들에 플레이어의 상태 값을 저장하는 PlayerState 클래스를 이용하여 넣어보자.
//TOPlayerState.h
#include "Tellours.h"
#include "GameFramework/PlayerState.h"
#include "TOPlayerState.generated.h"
/**
*
*/
UCLASS()
class TELLOURS_API ATOPlayerState : public APlayerState
{
GENERATED_BODY()
public:
ATOPlayerState();
void InitPlayerData();
void SavePlayerData();
FString SaveSlotName;
UPROPERTY()
FVector PlayerLocation;
UPROPERTY()
int32 HP;
UPROPERTY()
int32 Level;
};
PlayerState를 상속받는 TOPlayerState C++ 클래스를 생성한다.
//TOPlayerState.cpp
#include "TOPlayerState.h"
#include "TOCharacter.h"
#include "TOCharacterStatComponent.h"
#include "TOSaveGame.h"
ATOPlayerState::ATOPlayerState()
{
SaveSlotName = TEXT("SaveDatafile_1");
}
void ATOPlayerState::InitPlayerData()
{
auto TOSaveGame = Cast<UTOSaveGame>(UGameplayStatics::LoadGameFromSlot(SaveSlotName, 0));
//SaveData가 존재하지 않을 시 실행됨.
if (TOSaveGame == nullptr)
{
TOSaveGame = GetMutableDefault<UTOSaveGame>();
}
PlayerLocation = TOSaveGame->PlayerLocation;
HP = TOSaveGame->HP;
Level = TOSaveGame->Level;
auto TOCharacter = Cast<ATOCharacter>(GetWorld()->GetFirstPlayerController()->GetPawn());
TOCharacter->SetActorLocation(PlayerLocation);
TOCharacter->CharacterStat->SetNewLevel(Level);
TOCharacter->CharacterStat->SetHP(HP);
}
void ATOPlayerState::SavePlayerData()
{
UTOSaveGame* NewPlayerData = NewObject<UTOSaveGame>();
auto TOCharacter = Cast<ATOCharacter>(GetWorld()->GetFirstPlayerController()->GetPawn());
// 세이브 데이터 지정
NewPlayerData->PlayerLocation = TOCharacter->GetActorLocation();
NewPlayerData->Level = (int32)(TOCharacter->CharacterStat->GetCurrentLevel());
NewPlayerData->HP = (int32)(TOCharacter->CharacterStat->GetCurrentHP());
if (!UGameplayStatics::SaveGameToSlot(NewPlayerData, SaveSlotName, 0))
{
ABLOG(Error, TEXT("SaveGame Error!"));
}
생성자에서 이 클래스를 이용해 저장하는 세이브 파일의 이름을 ‘SaveDatafile_1’으로 설정한다.
맨 처음 이 클래스가 실행될 때 InitPlayerData()가 실행되는데, SaveGame 파일을 가져오는 TOSaveGame 변수를 이용해 저장파일을 불러온다.
만약 파일이 존재하지 않을 경우, GetMutableDefault를 이용해 새로운 저장 파일을 생성한다.
현재 TOPlayerState에 존재하는 변수 값(PlayerLocation. HP 등…)에다가 TOSaveGame에 저장되어 있는(저장 파일)값을 가져와 넣어주게 된다.
나중에 체크포인트에서 저장할 수 있는 기능을 구현하였는데, 이 때 사용되는 함수가 바로 SavePlayerData()이다.
여기서는 지금 조종하고 있는 캐릭터를 TOCharacter로 Cast해서 가져온 뒤에, 이 캐릭터의 Location과 Level 등등을 가져온 뒤에 TOSaveData형식의 NewPlayerData값에 넣어준 뒤, UGameplayStatics::SaveGameToSlot(NewPlayerData, SaveSlotName, 0)를 이용하여 저장하게 된다.
이 저장 파일은 게임 폴더 내의 Saved→SaveGames폴더 내에 들어가 있다.
'UnrealEngine > 공부' 카테고리의 다른 글
[Unreal Engine C++] 특정 위치로의 레벨 텔레포트의 구현 (1) | 2024.02.27 |
---|---|
[Unreal Engine C++] 연속 공격의 구현 (0) | 2024.02.27 |
[Unreal Engine C++] Dash의 이펙트 구현 (0) | 2024.02.27 |
[Unreal Engine C++] Dash 구현 (0) | 2024.02.27 |
[Unreal Engine C++] UI IMAGE Animation 적용 (0) | 2024.01.17 |
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!