UE4 实现真加载Loading Screen/movie player

Setup

首先需要一个自定义的GameInstance;

GameInstance是引擎第一批初始化的对象之一,并且持续整个游戏会话;

  1. 创建一个UGameInstance class,这里命名为MyGameInstance

在这里插入图片描述

在这里插入图片描述

  1. 在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后才会看到效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值