이전에 Save기능을 구현했었다.
여기서 더 나아가 SaveGame을 할 때 자신이 현재 있는 레벨을 저장해서 이후 다시 게임을 시작할 때 불러와야 한다.
이를 구현해보자.
//TOSaveGame.h
#pragma once
#include "Tellours.h"
#include "GameFramework/SaveGame.h"
#include "TOSaveGame.generated.h"
/**
*
*/
UCLASS()
class TELLOURS_API UTOSaveGame : public USaveGame
{
GENERATED_BODY()
public:
UTOSaveGame();
UPROPERTY()
FName MapName;
...
};
//TOSaveGame.cpp
#include "TOSaveGame.h"
UTOSaveGame::UTOSaveGame()
{
MapName = FName("Room");
...
}
맵에 대한 이름을 저장하는 방식으로 구현하기 위해서 FName을 이용해서 기본 값을 SaveGame에 생성해준다.
//TOPlayerState.cpp
#include "TOPlayerState.h"
#include "TOCharacter.h"
#include "TOCharacterStatComponent.h"
#include "TOSaveGame.h"
#include <string>
...
void ATOPlayerState::InitPlayerData()
{
auto TOSaveGame = Cast<UTOSaveGame>(UGameplayStatics::LoadGameFromSlot(SaveSlotName, 0));
...
MapName = TOSaveGame->MapName;
...
UGameplayStatics::LoadStreamLevel(this, MapName, true, false, LatentActionInfo);
}
void ATOPlayerState::OnStreamLevelLoaded()
{
auto TOCharacter = Cast<ATOCharacter>(GetWorld()->GetFirstPlayerController()->GetPawn());
TOCharacter->SetActorLocation(PlayerLocation);
}
void ATOPlayerState::SavePlayerData(FString LevelName)
{
...
NewPlayerData->MapName = FName(LevelName);
...
}
캐릭터의 State를 관리하는 TOPlayerState에서 맵을 불러오고, 캐릭터를 이동시키는 기능을 수행한다.
이 때 저장 기능을 담당하는 SavePlayerData에서 LevelName을 받아서 캐릭터 저장 데이터의 MapName에 저장해준다.
이 SavePlayerData를 불러오는 곳은 바로 캐릭터의 Interaction부분인데 코드는 다음과 같다.
//TOCharacter.cpp
void ATOCharacter::Interaction()
{
...
// 체크포인트 세이브
else if (LockCheckPoint != nullptr)
{
auto TOPlayerState = Cast<ATOPlayerState>(GetPlayerState());
const auto TOPlayerController = Cast<ATOPlayerController>(GetWorld()->GetFirstPlayerController());
TOPlayerState->SavePlayerData(LockCheckPoint->GetLevel()->GetOuter()->GetName());
LockCheckPoint->SavedGame();
TOPlayerController->ShowSaveScriptUI();
return;
}
...
}
현재 이 게임의 맵은 하나의 퍼시스턴트 레벨에서 여러 자손 레벨들을 불러오는 형태로 되어 있다.
체크포인트에서 저장할 때, GetWorld()를 하게 되면 현재 로드되어 있는 자손 레벨이 아닌 퍼시스턴트 레벨이 저장된다.
그러므로 체크포인트가 존재하는 레벨을 불러와서 그 이름 값을 저장하기 위해 다음과 같은 코드를 사용하였다.
TOPlayerState->SavePlayerData(LockCheckPoint->GetLevel()->GetOuter()->GetName());
LockCheckPoint는 위에서 Interaction을 담당하기 위해 생성해둔 변수인데, 이 값에는 현재 Interaction을 하기 위한 ATOCheckPoint가 들어가 있다.
이 값에서 레벨을 불러와서 저장해준 뒤, SavePlayerData에 값을 넘겨주는 기능을 수행한다.
결과는 다음과 같다.
'UnrealEngine > 공부' 카테고리의 다른 글
[Unreal Engine C++] Fireball의 구현 (1) | 2024.02.27 |
---|---|
[Unreal Engine C++] 진행도에 따른 텔레포트 설정 (1) | 2024.02.27 |
[Unreal Engine C++] 특정 위치로의 레벨 텔레포트의 구현 (1) | 2024.02.27 |
[Unreal Engine C++] 연속 공격의 구현 (0) | 2024.02.27 |
[Unreal Engine C++] SaveData의 구현 (0) | 2024.02.27 |
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!