Setup
首先需要一个自定义的GameInstance;
GameInstance是引擎第一批初始化的对象之一,并且持续整个游戏会话;
- 创建一个UGameInstance class,这里命名为MyGameInstance
- 在Project Setting中,找到GameInstance,点+号,创建一个GameInstance Blueprint,然后设置父类为刚建GameInstance;
Movie Player Module
MoviePlayer模块可以与游戏引擎进行对话,并在完成任务时告知游戏引擎,从而使引擎继续运行。
MoviePlayer在其自己的线程中运行,这意味着它可以在引擎停止等待文件加载的同时运行。 另外,因为它在后台线程中,所以您必须使用Slate小部件,而不是较新的UMG小部件。
为了使用Movie Player模块,我们必须将其包含在我们的项目中。 打开游戏的 Build.CS 文件,然后添加MoviePlayer模块,如下所示:
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MoviePlayer" });
code
回到之前创建的GameInstance class
MyGameInstance.h
public:
UMyGameInstance();
void BeginLoadMap(const FString& MapName);
void EndLoadMap(UWorld* LoadedWorld);
UPROPERTY()
UUserWidget* CurrentWidget;
// loading widget
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UMGGame")
TSubclassOf<UUserWidget> LoadingWidget;
};
MyGameInstance.cpp主要代码
FLoadingScreenAttributes
https://docs.unrealengine.com/en-US/API/Runtime/MoviePlayer/FLoadingScreenAttributes/index.html
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
//#include "Runtime/MoviePlayer/Public/MoviePlayer.h"
#include "MoviePlayer.h"
...
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Warning, TEXT("---INIT----"));
//PreLoadMap,开始加载map
FCoreUObjectDelegates::PreLoadMap.AddUObject(this, &UMyGameInstance::BeginLoadMap);
//PostLoadMapWithWorld, 加载完成后
FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UMyGameInstance::EndLoadMap);
}
void UMyGameInstance::BeginLoadMap(const FString& MapName)
{
//if (IsRunningDedicatedServer())
//{
// return;
// }
FLoadingScreenAttributes LoadingScreen;
LoadingScreen.bAutoCompleteWhenLoadingCompletes = false;
LoadingScreen.bWaitForManualStop = false;
LoadingScreen.bMoviesAreSkippable = false;
LoadingScreen.MinimumLoadingScreenDisplayTime = 1.5f; // movie最少播放时间
LoadingScreen.WidgetLoadingScreen = FLoadingScreenAttributes::NewTestLoadingScreenWidget(); // movie不存在时,显示的widget
if (LoadingWidget != nullptr)
{
CurrentWidget = CreateWidget<UUserWidget>(this, LoadingWidget);
TSharedPtr<SWidget> LoadScreen = CurrentWidget->TakeWidget();
LoadingScreen.WidgetLoadingScreen = LoadScreen;
}
else
{
UE_LOG(LogTemp, Warning, TEXT("LoadingWidget == nullptr"));
}
GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
}
void UMyGameInstance::EndLoadMap(UWorld* LoadedWorld)
{
UE_LOG(LogTemp, Warning, TEXT("end load map"));
}
...
打开MyGameInstance_BP ,设置做好的Widget
然后需要点击Launch或Package后才会看到效果