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);
}

 

이제 체크 포인트에 닿으면 해당 위치에서 캐릭터가 소환되는 것을 볼 수 있다.

 

게임을 로드했을 때 이미 도달한 체크 포인트는 활성화된 상태로 두고, 제거된 몬스터는 소환되지 않는 등의 월드 저장 작업은 차후로 미루고, 캐릭터의 정보를 저장하는 작업을 우선적으로 실시할 것이다.