0. 개요
맵이 변경되어도 데이터를 유지시키는 방법은 게임 인스턴스를 이용하는 것이 있다.
커스텀 게임 인스턴스 클래스를 생성하여, 플레이어 스타트 태그의 정보를 저장하고 가져온다.
1. 커스텀 게임 인스턴스 클래스
(1) 클래스 생성
GameInstance 클래스를 상속받는 AuraGameInstance 클래스를 생성한다.
(2) AuraGameInstance 클래스 구성
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "AuraGameInstance.generated.h"
UCLASS()
class AURA_API UAuraGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
UPROPERTY()
FName PlayerStartTag = FName();
UPROPERTY()
FString LoadSlotName = FString();
UPROPERTY()
int32 LoadSlotIndex = 0;
};
각 레벨 간 저장하여 사용할 데이터를 여기에 선언한다.
플레이어 스타트 태그는 플레이어가 레벨을 건너가면 소환될 위치를 식별하기 위해 필요하며, 로드 슬롯의 이름과 인덱스는 해당 데이터를 불러오고 저장하기 위해 필요하다.
(3) AuraGameModeBase에서 기본 플레이어 스타트 태그 지정
UPROPERTY(EditDefaultsOnly)
FName DefaultPlayerStartTag;
(4) 슬롯 생성 이후 게임 인스턴스로 정보 넘기기
void UMVVM_LoadScreen::NewSlotButtonPressed(int32 Slot, const FString& EnteredName)
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 슬롯에 게임 저장
AuraGameMode->SaveSlotData(LoadSlots[Slot], Slot);
LoadSlots[Slot]->InitializeSlot();
// 게임 인스턴스로 정보 넘겨주기
UAuraGameInstance* AuraGameInstance = Cast<UAuraGameInstance>(AuraGameMode->GetGameInstance());
AuraGameInstance->LoadSlotName = LoadSlots[Slot]->LoadSlotName;
AuraGameInstance->LoadSlotIndex = LoadSlots[Slot]->SlotIndex;
AuraGameInstance->PlayerStartTag = AuraGameMode->DefaultPlayerStartTag;
}
게임 인스턴스로 새로운 슬롯의 이름과 인덱스, 플레이어 스타트 태그를 넘긴다.
(5) AuraGameModeBase에서 ChoosePlayerStart 오버라이드 함수 수정
AActor* AAuraGameModeBase::ChoosePlayerStart_Implementation(AController* Player)
{
// 게임 인스턴스에서 정보 가져오기
UAuraGameInstance* AuraGameInstance = Cast<UAuraGameInstance>(GetGameInstance());
// 플레이어 스타트 클래스 수집
TArray<AActor*> Actors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), Actors);
if (Actors.Num() > 0)
{
// 맵에 존재하는 플레이어 스타트 중 처음 것을 기본으로 선택
AActor* SelectedActor = Actors[0];
for (AActor* Actor : Actors)
{
if (APlayerStart* PlayerStart = Cast<APlayerStart>(Actor))
{
// 태그와 일치하는 플레이어 스타트를 반환
if (PlayerStart->PlayerStartTag == AuraGameInstance->PlayerStartTag)
{
SelectedActor = PlayerStart;
break;
}
}
}
return SelectedActor;
}
return nullptr;
}
이제 하드코딩된 플레이어 스타트 지점이 아닌, 게임 인스턴스에서 받아온 플레이어 스타트 태그를 이용해 해당 플레이어 스타트를 가져온다.
(6) BP_AuraGameMode에서 기본 플레이어 스타트 태그 지정

(6-1) AuraGameInstance를 부모로 하는 BP_AuraGameInstance 생성

(6-2) 프로젝트 세팅에서 게임 인스턴스를 BP_AuraGameInstance로 지정

(6-3) 플레이어 스타트를 생성하고 태그를 지정


이제 슬롯을 생성하고 시작하면 플레이어 스타트 태그와 일치하는 플레이어 스타트에서 게임을 시작한다.
하지만 슬롯을 다시 선택하고 시작하면 기본 플레이어 스타트에서 시작되는 것을 볼 수 있다.
이는 새로운 슬롯을 생성할 때만 게임 인스턴스에 태그를 넘겨주고 있기 때문이다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
| 29-4. 저장 - (5) 플레이어 스타트를 상속받는 체크 포인트 액터 (0) | 2025.04.07 |
|---|---|
| 29-3. 저장 - (4) 플레이어 스타트 태그 저장 (0) | 2025.04.07 |
| 29-1. 플레이어 스타트 선택 (0) | 2025.04.07 |
| 28-14. 로드 메뉴 UI - (10) 맵 불러오기 (0) | 2025.04.07 |
| 28-13. 로드 메뉴 UI - (9) 필드 노티파이 - 맵 이름 가져오기 (0) | 2025.04.07 |
