Unreal 로딩 구현하기 cpp
- 프로그래밍/언리얼
- 2024. 12. 24.
언리얼 로딩 구현하기
아래의 글은 언리얼에서 로딩 화면 구현에 대한 글입니다.
로딩을 구현하는 방법은 여러가지가 있지만 이 글은 그중 한가지를 보여주는 글입니다.
맵 로드가 시작되기 전에 로딩 화면을 설정하고, 최소 2초 동안 표시되도록 설정했습니다.
로딩 화면은 LoadingWidget으로 보여지며, 맵이 로드된 후 로딩 화면을 종료합니다.
언리얼 로딩 구현하기 cpp
UGameInstance는 게임을 종료하거나 맵을 전환할 때도 유지됩니다.
이러한 특징으로 인해 맵 전환시에도 필요한 데이터를 유지하거나 로딩 화면을 표시하는 등의 작업에도 좋다고 생각해서 SlashGameInstace를 하나 만들어서 사용했습니다.
아래 코드들을 사용하기 위해서는 모듈을 추가해야 합니다.
"MoviePlayer"
USlashGameInstance.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "SlashGameInstance.generated.h"
class UUserWidget;
/**
*
*/
UCLASS()
class SLASH_API USlashGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
TSoftObjectPtr<UWorld> GetLevel(FString LevelName);
protected:
//게임 인스턴스가 처음 생성될 때 호출됨.
virtual void Init()override;
UFUNCTION()//맵 로드가 시작되기 전에 로딩화면을 설정.
void OnPreLoadMap(const FString& PreLoadMap);
UFUNCTION()//맵이 로드된 후 로딩 화면을 종료.
void OnDestinatioonWorldLoaded(UWorld* LoadedWorld);
UPROPERTY(EditDefaultsOnly)
TSoftClassPtr<UUserWidget> LoadingWidgetClass;
private:
//String을 키로 사용해서 저장된 Level을 가져옴
UPROPERTY(EditDefaultsOnly, Category = "Level")
TMap<FString, TSoftObjectPtr<UWorld>> MapList;
};
USlashGameInstance.cpp
#include "SlashGameInstance.h"
#include "Blueprint/UserWidget.h"
#include "MoviePlayer.h"
void USlashGameInstance::Init()
{
Super::Init();
FCoreUObjectDelegates::PreLoadMap.AddUObject(this,&ThisClass::OnPreLoadMap);
FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &ThisClass::OnDestinatioonWorldLoaded);
}
void USlashGameInstance::OnPreLoadMap(const FString& PreLoadMap)
{
//위젯 동기적으로 생성.
const auto LoadingWidget = CreateWidget<UUserWidget>(this, LoadingWidgetClass.LoadSynchronous(), TEXT("LoadingScreen"));
TSharedRef<SWidget> LoadingSWidgetPtr = LoadingWidget->TakeWidget();
FLoadingScreenAttributes LoadingScreenAttributes;
LoadingScreenAttributes.bAutoCompleteWhenLoadingCompletes = true;
//로딩화면 최소 2초 유지.
LoadingScreenAttributes.MinimumLoadingScreenDisplayTime = 2.f;
//기본 로딩 위젯
//LoadingScreenAttributes.WidgetLoadingScreen = FLoadingScreenAttributes::NewTestLoadingScreenWidget();
LoadingScreenAttributes.WidgetLoadingScreen = LoadingSWidgetPtr;
//로딩 시작.
GetMoviePlayer()->SetupLoadingScreen(LoadingScreenAttributes);
}
void USlashGameInstance::OnDestinatioonWorldLoaded(UWorld* LoadedWorld)
{ //로딩 종료
GetMoviePlayer()->StopMovie();
}
TSoftObjectPtr<UWorld> USlashGameInstance::GetLevel(FString LevelName)
{
//맵 가져오기.
if (MapList.IsEmpty()) {
UE_LOG(LogTemp, Warning, TEXT("Map List Is Null Please Fill"));
return nullptr;
}
return *MapList.Find(LevelName);
}
init() : 게임 인스턴스가 처음 생성될 때 호출됨.
PreLoadMap : 맵 로드가 시작되기 전에 로딩화면을 설정.
PostLoadMapWithWorld : 맵이 로드된 후 로딩 화면을 종료.
블루프린트(위젯 만들기) + 설정.
적당한 LoadingWidget을 만듭니다.
없으면 위의 코드에서 그냥 주석처리 해놓은것으로 사용합니다.
만들어놓은 GameInstance를 블루프린트로 만들어서 로딩위젯 클래스를 넣어줬습니다.
게임 인스턴스에 코드를 썻으니 이걸 사용하기 위해 Edit->ProjectSettings->GameInstance->BP_SlashGameInstance로 설정해줬습니다.
결과 영상.
코드에 적어놓은 FLoadingScreenAttributes::NewTestLoadingScreenWidget()과 LoadingSWidgetPtr을 사용한 경우 모두 들어있는 영상입니다.
//LoadingScreenAttributes.WidgetLoadingScreen = FLoadingScreenAttributes::NewTestLoadingScreenWidget();
LoadingScreenAttributes.WidgetLoadingScreen = LoadingSWidgetPtr;