1. 어빌리티 업그레이드 저장 및 불러오기

 

(1) LoadScreenSaveGame - 저장 오브젝트 클래스에 어빌리티 업그레이드 배열 추가

	UPROPERTY()
	FGameplayTagContainer SavedAbilityUpgrades;

 

(1-2) AuraPlayerState - 어빌리티 업그레이드 태그 컨테이너에 대한 Getter, Setter 함수 생성

	FGameplayTagContainer& GetAbilityUpgradeTagContainer(){ return OwnedAbilityUpgradeTags; }
	void SetAbilityUpgradeTagContainer(const FGameplayTagContainer& InTagContainer);
void AAuraPlayerState::SetAbilityUpgradeTagContainer(const FGameplayTagContainer& InTagContainer)
{
    OwnedAbilityUpgradeTags = InTagContainer;
}

 

 

 

(2) AuraCharacter - 게임 저장 시 어빌리티 업그레이드 저장하기

void AAuraCharacter::SaveProgress_Implementation(const FName& CheckpointTag)
{
    // 저장중 위젯 생성
    if (AAuraPlayerController* AuraPC = Cast<AAuraPlayerController>(GetController()))
    {
        if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPC->GetHUD()))
        {
            AuraHUD->CreateSaveProgressWidget();
        }
    }
    
    // 게임 모드에 접근
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(this));
    
    if (AuraGameMode)
    {
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        // 활성화된 어빌리티에 대하여 델리게이트 호출
        AuraASC->ForEachAbility(SaveAbilityDelegate);

        // 어빌리티 업그레이드 저장
        if (AAuraPlayerState* AuraPS = GetPlayerState<AAuraPlayerState>())
        {
            SaveData->SavedAbilityUpgrades = AuraPS->GetAbilityUpgradeTagContainer();
        }
        
        AuraGameMode->SaveInGameProgressData(SaveData);
        
        // 저장중 위젯 제거
        if (AAuraPlayerController* AuraPC = Cast<AAuraPlayerController>(GetController()))
        {
            if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPC->GetHUD()))
            {
                AuraHUD->RemoveSaveProgressWidget();
            }
        }
    }
}

플레이어 스테이트의 저장된 어빌리티 업그레이드 태그 컨테이너를 저장 오브젝트 클래스에 저장한다.

 

 

(3) AuraCharacter - 게임 불러오기 시 저장 데이터의 태그 컨테이너 가져오기

void AAuraCharacter::LoadProgress()
{
    // 게임 모드에 접근
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(this));

    if (AuraGameMode)
    {
        // 저장 슬롯 찾기
        ULoadScreenSaveGame* SaveData = AuraGameMode->RetrieveInGameSaveData();
        if (SaveData == nullptr)
            return;

        // 첫 로딩일 때
        if (SaveData->bFirstTimeLoading)
        {
            // 기본 1차 속성 적용
            InitializeDefaultAttributes();
            AddCharacterAbilites();
        }
        else
        {
            UAuraAbilitySystemComponent* AuraASC = CastChecked<UAuraAbilitySystemComponent>(AbilitySystemComponent);
            
            // 서버에서만 실행
            if (HasAuthority() == false)
                return;
            
            // 저장된 세이브에서 어빌리티 불러오기
            AuraASC->AddCharacterAbilitiesFromSaveData(SaveData);
            
            // 저장된 데이터 불러오기
            if (AAuraPlayerState* AuraPlayerState = Cast<AAuraPlayerState>(GetPlayerState()))
            {
                AuraPlayerState->SetLevel(SaveData->PlayerLevel);
                AuraPlayerState->SetXP(SaveData->XP);
                AuraPlayerState->SetAttributePoints(SaveData->AttributePoints);
                AuraPlayerState->SetSpellPoints(SaveData->SpellPoints);
                AuraPlayerState->SetAbilityUpgradeTagContainer(SaveData->SavedAbilityUpgrades);
            }

 

 

저장 이후 불러오기를 할 때에도, 맵을 이동할 때에도 어빌리티 업그레이드가 잘 적용되는 것을 볼 수 있다.