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);
}
저장 이후 불러오기를 할 때에도, 맵을 이동할 때에도 어빌리티 업그레이드가 잘 적용되는 것을 볼 수 있다.
