即使开放世界已然成为现今游戏趋势,切换关卡过程中的读条仍是很难避免的,譬如进入房屋、传送到其他世界等等。

于是就引入了loadingscreen这一需求。

loadingscreen顾名思义就是加载过程中通过其他线程显示的画面,可以是真读条(显示当前进度),也可以仅仅转着圈,循环播放某段视频。

我们首先需要新建c++类MyGameInstance继承自GameInstance,并在项目设置中将其设为当前使用的

这里我先创建了一个继承自MyGameInstance的蓝图,叫bp_MyGameInstance。

开始写代码之前,还有这些准备工作:

1.在projectname.build.cs文件中增加"MoviePlayer","UMG", "Slate", "SlateCore"几项

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject",
"Engine", "InputCore", "HeadMountedDisplay",
"MoviePlayer",
"UMG", "Slate", "SlateCore"});

2.在projectname.h中包含一些头文件

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h" #include "Runtime/MoviePlayer/Public/MoviePlayer.h"
#include "Runtime/SlateCore/Public/Widgets/SWidget.h"

然后重写gameinstance中的这个函数

virtual void Init() override;
void UMyGameInstance::Init()
{
UGameInstance::Init(); FCoreUObjectDelegates::PreLoadMap.AddUObject(this, &UMyGameInstance::BeginLoadingScreen);
FCoreUObjectDelegates::PostLoadMap.AddUObject(this, &UMyGameInstance::EndLoadingScreen);
}

接下来这两个函数

UFUNCTION()
virtual void BeginLoadingScreen(const FString& MapName);
UFUNCTION()
virtual void EndLoadingScreen();
void UMyGameInstance::BeginLoadingScreen(const FString& MapName)
{ loadlevel_count++;
if (!IsRunningDedicatedServer())
{ FLoadingScreenAttributes LoadingScreen;
LoadingScreen.bAutoCompleteWhenLoadingCompletes = false;
LoadingScreen.bMoviesAreSkippable = true;//任意键打断如果加载完成
LoadingScreen.bWaitForManualStop = true;//
LoadingScreen.PlaybackType = EMoviePlaybackType::MT_Looped; //不知道怎么destroy..
inWidget = CreateWidget<UUserWidget>(this, WidgetTemplate);//应该有垃圾回收 TSharedPtr<SWidget> WidgetPtr = inWidget->TakeWidget();
LoadingScreen.WidgetLoadingScreen = WidgetPtr; LoadingScreen.MoviePaths.Add("squad_intro_movie");
GetMoviePlayer()->SetupLoadingScreen(LoadingScreen); }
} void UMyGameInstance::EndLoadingScreen()
{ if (!IsRunningDedicatedServer())
{ }
}

上文中的squad_intro_movie其实是Content\Movies目录下的squad_intro_movie.mp4文件,不需要后缀名,要注意不是将其拖到编辑器中,而是把mp4文件复制到实际工程文件目录里。

而WidgetTemplate则是mygameinstance暴露到蓝图的用于Loadingscreen的控件类,

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = UI)
TSubclassOf<UUserWidget> WidgetTemplate;
UUserWidget* inWidget = NULL;

inWidget才是真正被create出来的控件对象,虽然每次loading都新create了一次,但是ue4对控件应该有自己的垃圾回收机制。

至于控件蓝图,需要从mygameinstance中获取当前loading是否完成

UFUNCTION(BlueprintPure, Category = MyGameInstance)
bool myisloadingfinished();
bool UMyGameInstance::myisloadingfinished()
{ return GetMoviePlayer()->IsLoadingFinished();
}

我的loadingscreen控件蓝图目前只包含三样东西:

加载过程中throbber(就是那个点点点)显示,而“请按任意键继续”的文本隐藏;

加载完成时反之。

textblock的visibility函数:

点点点的visibility函数:

要注意的是点击视口中运行并不能看到效果,需要选择独立窗口运行。

然后就大功告成啦!!!这里借用了一下squad的小视频

ue4加载界面(loadingscreen)的实现的更多相关文章

  1. [UE4]场景加载界面

    就可以这样就可以了,当另外一个场景成功打开后,场景加载界面也会自动消失(因为这是加载界面是添加到当前场景). 加上delay是为了在小场景测试的时候可以方便看到加载场景,避免场景加载过快看不到,不加的 ...

  2. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

  3. DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素. 我们需要以下几个步骤: 创建并初始化CPaintManagerUI对象. 创建CDialogBu ...

  4. Egret白鹭开发小游戏之自定义load加载界面

    刚接触不久就遇到困难------自定义loading.想和其他获取图片方式一样获取加载界面的图片,结果发现资源还没加载就需要图片,在网上百度了许多,都没有找到正确的方式,通过自己的摸索,终于,,,我成 ...

  5. 【UE4】异步加载关卡 LoadingScreen ( 蓝图和C++ )

    一般先跳转到一个临时的关卡,然后异步加载目标关卡,同时展示Loading界面 对于含有流关卡的目标关卡,可以先载入子关卡 蓝图异步加载 无进度条 C++ 异步加载关卡 LoadPackageAsync ...

  6. 巧用 mask-image 实现简单进度加载界面

    最近给 nzoo 折腾官网,拿 angular2.0 + webpack 实现SPA,然后觉得最终打包后的出口文件有点大,用户首次访问会有一个时间较长的白屏等候界面,感觉体验不太好. 于是希望在用户下 ...

  7. android 点击重新加载界面设计

    在项目中经常会遇到这样的场合,用户点击了一个界面后要提示等待加载,最后有可能显示加载失败,点击屏幕再重试加载.下面是该实例的代码: layout: loading.xml <?xml versi ...

  8. Android系统编程入门系列之加载界面Activity

    上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...

  9. 解决AndroidStudio导入项目卡在gradle加载界面

    为了节省排版时间,直接上图了,图片若看不清,可在新标签中打开查看. 文中图片上涉及到的一些链接如下: maven { url 'http://maven.aliyun.com/nexus/conten ...

随机推荐

  1. iOS开发tips-UINavigationBar的切换

    概述 在iOS系统中,如果控制器是以push方式进行管理的话,那么事实上多个控制器是共享的同一个导航栏.当然iOS系统的设计无可厚非,但是国内的应用经常会遇到很多个性的设计,就比如说A push到 B ...

  2. ubuntu系统搭建以太坊私有链

    1.安装curl.git apt-get update apt-get install git apt-get install curl 2.安装go curl -O https://storage. ...

  3. SOM网络聚类完整示例(利用python和java)

    下面是几个城市的GDP等信息,根据这些信息,写一个SOM网络,使之对下面城市进行聚类.并且,将结果画在一个二维平面上. //表1中,X.为人均GDP(元):X2为工业总产值(亿元):X.为社会消费品零 ...

  4. Java学习笔记——序列化和反序列化

    寒雨连江夜入吴,平明送客楚山孤. 洛阳亲友如相问,一片冰心在玉壶. --芙蓉楼送辛渐 持久化数据的第一种方式.在序列化之前也可以把数据打散逐行存储在文件中,然后在逐行读取. 比如定Student类 用 ...

  5. BM算法详解

    http://www-igm.univ-mlv.fr/~lecroq/string/node14.html http://www.cs.utexas.edu/users/moore/publicati ...

  6. JAVA IO中的设计模式

    在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式.       在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和 ...

  7. vue、rollup、sass、requirejs组成的vueManager

    近段时间本人一直在思考如何基于vue搭建一个中后端管理系统的通用基础前端解决方案.思考的主要问题点如下: 如何使各个子业务模块的按需加载 css预处理方案的选择 如何引入现代的前端工程思想,也就是工程 ...

  8. cocoapods安装和使用常见问题及解决方案

    cocopods安装后pod install出现以下错误 /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems.rb:270:in find_s ...

  9. 关于ubuntu的图标创建以及快捷方式打开

    //这里个人要添加的的为微信小程序开发工具 1:终端命令: sudo gedit /usr/share/applications/MyChat.desktop 2:修改启动器配置如下: [Deskto ...

  10. 开涛spring3(6.6) - AOP 之 6.6 通知参数

    前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式. 使用JoinPoint获取:Spring AOP提供使用org.asp ...