0. 개요
체크 포인트 액터에 오버랩 된 플레이어의 속성, 어빌리티, 레벨 등을 저장하기 위해 플레이어 인터페이스에 함수를 만들고 이를 사용한다.
1. 플레이어 인터페이스
(1) PlayerInterface에서 진행 상황 저장 함수 선언
/*
/ 저장
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
void SaveProgress(const FName& CheckpointTag);
(2) AuraChactacter에서 인터페이스 함수 오버라이드
virtual void SaveProgress_Implementation(const FName& CheckpointTag) override;
// 플레이어 인터페이스 끝
(3) AuraGameModeBase에서 게임 세이브 데이터를 참조하여 저장 데이터 반환
ULoadScreenSaveGame* RetrieveInGameSaveData();
ULoadScreenSaveGame* AAuraGameModeBase::RetrieveInGameSaveData()
{
UAuraGameInstance* AuraGameInstance = Cast<UAuraGameInstance>(GetGameInstance());
const FString InGameLoadSlotName = AuraGameInstance->LoadSlotName;
const int32 InGameLoadSlotIndex = AuraGameInstance->LoadSlotIndex;
return GetSaveSlotData(InGameLoadSlotName, InGameLoadSlotIndex);
}
게임 인스턴스를 가져와 로드 슬롯의 이름과 인덱스를 사용하여 저장 데이터를 가져오는 함수이다.
GetSaveSlotData 함수는 아래와 같다.
ULoadScreenSaveGame* AAuraGameModeBase::GetSaveSlotData(const FString& SlotName, int32 SlotIndex) const
{
USaveGame* SaveGameObject = nullptr;
if (UGameplayStatics::DoesSaveGameExist(SlotName, SlotIndex))
{
// 저장 게임 오브젝트 가져오기
SaveGameObject = UGameplayStatics::LoadGameFromSlot(SlotName, SlotIndex);
}
else
{
// 없으면 생성
SaveGameObject = UGameplayStatics::CreateSaveGameObject(LoadScreenSaveGameClass);
}
// 커스텀 저장 게임 오브젝트로 캐스팅
ULoadScreenSaveGame* LoadScreenSaveGame = Cast<ULoadScreenSaveGame>(SaveGameObject);
return LoadScreenSaveGame;
}
GameplayStatics 클래스의 함수를 사용하여 게임 오브젝트를 만들고 커스텀 저장 게임 오브젝트로 캐스팅하여 리턴하는 함수이다.
(4) AuraGameModeBase에서 인게임 데이터를 저장하는 함수
void SaveInGameProgressData(ULoadScreenSaveGame* SaveObject);
void AAuraGameModeBase::SaveInGameProgressData(ULoadScreenSaveGame* SaveObject)
{
UAuraGameInstance* AuraGameInstance = Cast<UAuraGameInstance>(GetGameInstance());
const FString InGameLoadSlotName = AuraGameInstance->LoadSlotName;
const int32 InGameLoadSlotIndex = AuraGameInstance->LoadSlotIndex;
AuraGameInstance->PlayerStartTag = SaveObject->PlayerStartTag;
UGameplayStatics::SaveGameToSlot(SaveObject, InGameLoadSlotName, InGameLoadSlotIndex);
}
(5) AuraCharacter에서 인터페이스 함수 오버라이드
void AAuraCharacter::SaveProgress_Implementation(const FName& CheckpointTag)
{
// 게임 모드에 접근
AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(this));
if (AuraGameMode)
{
// 저장 슬롯 찾기
ULoadScreenSaveGame* SaveData = AuraGameMode->RetrieveInGameSaveData();
if (SaveData == nullptr)
return;
// 데이터 저장
SaveData->PlayerStartTag = CheckpointTag;
AuraGameMode->SaveInGameProgressData(SaveData);
}
}
추후에 많은 데이터를 담게 될 예정이지만, 지금은 체크 포인트 태그를 저장하여 해당 위치에서 캐릭터를 생성하도록 설정할 것이다.
2. 폴리싱
(1) CheckPoint에서 오버랩 콜백 함수에서 진행 상황 저장 함수 호출
void ACheckPoint::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor->Implements<UPlayerInterface>())
{
IPlayerInterface::Execute_SaveProgress(OtherActor, PlayerStartTag);
HandleGlowEffects();
}
}
(2) 게임 시작 버튼을 누르면 게임 인스턴스에 슬롯 이름과 인덱스 넘기기
void UMVVM_LoadScreen::PlayButtonPressed()
{
AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(this));
UAuraGameInstance* AuraGameInstance = Cast<UAuraGameInstance>(AuraGameMode->GetGameInstance());
AuraGameInstance->PlayerStartTag = SelectedSlot->PlayerStartTag;
AuraGameInstance->LoadSlotName = SelectedSlot->LoadSlotName;
AuraGameInstance->LoadSlotIndex = SelectedSlot->SlotIndex;
if (IsValid(SelectedSlot))
AuraGameMode->TravelToMap(SelectedSlot);
}
이제 체크 포인트에 닿으면 해당 위치에서 캐릭터가 소환되는 것을 볼 수 있다.
게임을 로드했을 때 이미 도달한 체크 포인트는 활성화된 상태로 두고, 제거된 몬스터는 소환되지 않는 등의 월드 저장 작업은 차후로 미루고, 캐릭터의 정보를 저장하는 작업을 우선적으로 실시할 것이다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
29-7. 저장 - (8) 어빌리티 저장 및 불러오기 (0) | 2025.04.08 |
---|---|
29-6. 저장 - (7) 플레이어 데이터 저장 및 불러오기, 디버그 (0) | 2025.04.07 |
29-4. 저장 - (5) 플레이어 스타트를 상속받는 체크 포인트 액터 (0) | 2025.04.07 |
29-3. 저장 - (4) 플레이어 스타트 태그 저장 (0) | 2025.04.07 |
29-2. 저장 - (3) 커스텀 게임 인스턴스 클래스 (0) | 2025.04.07 |