GameInstance
GameInstance
새로운 레벨이 로드가 되면 GameState에 구현한 생성자, BeginPlay가 다시 호출되며 게임의 정보가 초기화 된다. GameInstance 클래스는 레벨이 로드가 되어도 저장한 정보가 초기화 되지 않는다. 따라서, 게임 점수, 게임 시간 등의 게임이 진행되는 동안 유지가 되어야하는 정보는 GameInstance 클래스에 구현해야 한다.
작성한 코드
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "SpartaGameInstance.generated.h"
UCLASS()
class SPARTAPROJECT_API USpartaGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
USpartaGameInstance();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "GameData")
int32 TotalScore;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "GameData")
int32 CurrentLevelIndex;
UFUNCTION(BlueprintCallable, Category = "GameData")
void AddToScore(const int32 Amount);
};
#include "SpartaGameInstance.h"
USpartaGameInstance::USpartaGameInstance()
{
TotalScore = 0;
CurrentLevelIndex = 0;
}
void USpartaGameInstance::AddToScore(const int32 Amount)
{
TotalScore += Amount;
UE_LOG(LogTemp, Warning, TEXT("Total score: %d"), TotalScore);
}
GameState
GameState에 구현할 요소
GameState는 각각의 레벨을 관리하는 LevelManager 같은 느낌이고, GameInstance는 게임의 전역 데이터를 담당하는 GameManager의 역할을 하는 느낌이다. 레벨이 로드된 후, 레벨의 핵심적인 데이터와 관련된 로직을 처리하는 부분은 GameState에 구현하면 좋을 것 같다. 예를 들어, 각 스테이지의 웨이브 시간, 점수 획득, 다음 레벨 로드, 게임 오버 등이 해당된다.
새로 접한 함수
// 게임의 인스턴스를 가져온 후 캐스팅
UGameInstance* GameInstance = GetGameInstance()
USpartaGameInstance* SpartaGameInstance = Cast<USpartaGameInstance>(GameInstance);
// 현재 월드에서 ASpawnVolume 클래스에 해당되는 것들을 가져옴
TArray<AActor*> FoundVolumes;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASpawnVolume::StaticClass(), FoundVolumes);
// 스폰한 액터가 코인 아이템인지 확인. IsA는 CoinItem과 CoinItem의 자식도 포함.
AActor* SpawnedActor = SpawnVolume->SpawnRandomItem();
if(SpawnedActor && SpawnedActor->IsA(ACoinItem::StaticClass()))
// 새로운 레벨 로드
UGameplayStatics::OpenLevel(GetWorld(), LevelMapNames[CurrentLevelIndex]);
// 배열의 범위를 초과한 상태인지 확인
TArray<FName> LevelMapNames
LevelMapNames.IsValidIndex(CurrentLevelIndex)
예외처리에 도움이 될 함수들과 게임 내의 인스턴스에 접근할 수 있는 방법, GameplayStatics를 활용해서 특정 클래스에 접근하는 방법을 알 수 있었다.
느낀 점
Unity는 자체적으로 GameManager와 각 씬을 관리하는 Manager를 별도로 만들어줘야하는데, Unreal은 해당 기능을 제공하는 클래스가 구현이 되어있다는 사실이 놀랍네요 .. 이래서 다들 언리얼 ! 언리얼 ! 하는 건가봐요. 파고들면 파고들수록 매력에 빠지게 되는 .. 아직 깊게 들어가지도 않았는데 이 정도면 앞으로는 얼마나 더 놀라게 될지 ..
GameInstance랑 GameState는 직접 게임 프로젝트를 진행해보면서 자세히 알아봐야할 것 같네요.
'언리얼 엔진 > 스파르타코딩클럽' 카테고리의 다른 글
[언리얼엔진] 4-2. 메인 메뉴 구현 (0) | 2025.02.10 |
---|---|
[언리얼엔진] 4-1. UI 위젯 설계와 실시간 데이터 연동 (0) | 2025.02.10 |
[언리얼엔진] 3-4. 캐릭터 체력 및 점수 시스템 구현 (0) | 2025.02.06 |
[언리얼엔진] 3-3. 아이템 스폰 및 데이터테이블 관리 (1) | 2025.02.05 |
[언리얼엔진] 3-2. 충돌 이벤트로 획득하는 아이템 구현 (0) | 2025.02.04 |