Unreal 로딩 구현하기 cpp

250x250

언리얼 로딩 구현하기

아래의 글은 언리얼에서 로딩 화면 구현에 대한 글입니다.

로딩을 구현하는 방법은 여러가지가 있지만 이 글은 그중 한가지를 보여주는 글입니다.

맵 로드가 시작되기 전에 로딩 화면을 설정하고, 최소 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;

https://youtu.be/oBn3IHvAtHI

 

Designed by JB FACTORY