第三次引擎编程尝试

ronald9个月前职场5290

    本文用来介绍如何实现同步游戏状态给玩家,这里用到了前面介绍的HUD。

基本概念

HUD

    游戏过程中,游戏系统和玩家交互是非常有必要的,UE4提供了HUD来实现将游戏系统状态同步给玩家的方式,也就是说HUD对于玩家来说是只读的;

UI

    不同于HUD是将游戏系统状态同步给玩家,UI是用来提供一种将玩家意图传递给游戏系统的机制;

UMG

    UMG是引擎提供的可视化UI创作工具,用来创建需要呈现给玩家的UI元素,可以是游戏里面的HUD、菜单等;所以后续我们的HUD的创建也是通过UMG来做的。

UMG的使用

image-20220219213723299.png

UMG分为以下几部分:

    (1)控件区罗列展示界面的空间结构

    (2)控件区的组件直接拖拽到工作区,并在图层区进行层级编排

    (3)工作区选中控件之后,在属性区进行控件的属性设置

    (4)控件需要绑定执行流程,在属性区绑定之后在Graph进行流程编辑

游戏中添加HUD

创建Widget Blueprint并编辑

image-20220218141236459.pngimage-20220218141338438.png    游戏内预期效果是在角色没有拾取物品的时候显示文本search diamond,拾取之后变化文本search extract area;拖动文本控件到工作区,并进行文本控件的编辑:

image-20220218141640448.png

控件流程编辑

WXWorkCapture_16452796015935.png

    (1)变量区variable定义变量GetObjectiveExtractArea,定义类型variable typeText类型,并设置default value

    (2)接口区定义接口GetText0,其基本逻辑为获取角色指针GetOwningPlayerPawn转为游戏内角色数据指针Cast TO FPSTpl2Character,获取变量Is Carry Object值,传给Select节点,select节点把对应返回值传回Return Node

    这里用到了UMG常用的节点图:

节点图表

    节点图表由事件节点和函数调用节点组成的节点网络,用于定义对蓝图相关的事件的响应逻辑序列(可以认为是一个可视化的流程搭建工具);且一个蓝图可以有多个graph,即对不同事件定义不同的响应流程。Graph有多种类型,这里用到了Functions类型图表。

Functions

       Functions是一类属于特定蓝图的node graph,且可以被执行,也可以被蓝图内其他graph调用;Functions有一些设置项:

    Access Specifiers:控制Graph的访问权限,默认为public,即其他对象也能调用这个流程;

    Pure vs impure:区别在于pure functions是不会区修改对应蓝图类成员变量的值;通过pure functions做的事情是获取数据或者返回数据的值;

    在本例的Functions用到了:

select node

WXWorkCapture_16452824054234.png

    select node用于返回指定下标index的值,index类型如图所示,可以是boolean可以是integer等;

    在本例中indexbool类型,false 对应字符串GetObjectivetrue对应字符串ExtractAreaindex值为IsCarryObject的值,本质上即根据FPSTpl2Character->bIsCarryObject的值返回对应的字符串。


return node

WXWorkCapture_16452845206258.png

    蓝图中自定义的函数中,遇到return node会退出当前的执行流,并返回return value的输入值,return node的返回值为ReturnVal并定义类型为Text

    本例中return node返回select node的返回值,即根据bIsCarryObject的值返回返回对应的字符串


添加控件到玩家视窗

    通过上面的步骤,我们已经通过UMG完成玩家控件的编辑,下一步我们需要添加编辑好的控件到玩家视窗里面,此时就用到我们之前创建的HUD,并实例化之前创建的控件实例,如下:

image-20220218143841939.pngWXWorkCapture_16453205667843.png

    这里用到了event graphAddToViewport,分别进行介绍:

Event Graph

    所谓event graph是一种可视化的流程控制机制,可以让开发者针对特定的事件去定制化一些函数或者事件处理流程。本例针对的是BeginPlay这个事件,即游戏开始时会抛出这个事件。所以本例的流程可以描述为,当游戏开始时,会创建一个WP_Widgt实例,并添加到视图中AddToViewport


AddToViewport

    AddToViewport于将指定的控件对象添加到游戏的视图,并填满整个游戏区域。

    这里有一个viewportplayerscreen的区别需要关注,根据UE4官方文档的解释:所谓viewport即一个你看你创建的游戏世界的窗口,和player screen的区别在于,对于分屏类游戏,一个viewport可能有多个screen;于是有接口AddToPlayerScreen可以将控件仅添加到viewport的部分区域。


添加HUD到游戏设置中

    进行完上述的步骤,我们运行游戏还是看不到所创建和设置的HUD,这是因为我们还没有把我们的HUD添加到游戏设置中,这里我们需要以下两个步骤:

    第一步,创建GameMode并将我们创建的HUD绑定上去,如下图所示:

image-20220218145158511.pngimage-20220218145620483.pngWXWorkCapture_16453227598137.png    第二步:将我们创建的GameMode绑定到WorldSetting中,如下:

image-20220218145226838.pngimage-20220218145410193.pngimage-20220218150636227.png    以上,运行游戏有如下效果:

image-20220218150655766.png

参考资料

    UE4-初学UMG(一) - 泠枫Jun - 博客园 (cnblogs.com)

    Select | Unreal Engine Documentation



相关文章

LUA数据结构(一)

LUA数据结构(一)

Lua数据结构    Lua有8个基本类型,分别为:nil、boolean、number、string、userdata、function、thread和table;我们可以通过函数type函数获取变量类型,如下:a="cccd" dict={} print(type(a)) print(type(dict)) print(typ...

    栈(stack)一种操作受限的线性结构,限定仅能在尾部进行插入和删除,能进行插入和删除操作的一端叫做栈顶,而另一端叫做栈底;我们将插入栈的操作叫做入栈,从栈中删除元素的操作叫做出栈,栈是一个先入后出(FILO)的数据结构,即先入栈的元素会后出栈。    栈最常被我们接触的场景就是函数调用了,在进程地址空间中,有...

Lua的Upvalue和闭包(二)

Lua的Upvalue和闭包(二)

Lua闭包和Upvalue的实现    前面文章介绍了Lua闭包和upvalue的概念,本文简单过一下Lua对于闭包和upvalue的实现以加深理解。Lua闭包结构    Lua在内存的结构如下所示:#define ClosureHeader \ CommonHeader; lu_by...

Lua和C

Lua和C

一.背景    在实际游戏业务运营过程中,经常会出现一些紧急的配置修改、bug修复等;这种规划外的变更行为希望能做到用户无感知,否则对于游戏体验和产品口碑有很大影响,在此背景下,热更新能力成为成熟上线游戏的标准配置。    一般情况下,后台逻辑热更新能力的技术方案有两种:    ...

第二次引擎编程尝试

第二次引擎编程尝试

在这一节,我们尝试在游戏中创建一个物品并可以被角色拾取。在游戏世界里面创建一个物品创建物品对象    在创建对象的时候,需要我们选择对象的父类,选项卡中的父类对象他们各自有自己的适用范围,这里挑几个常用的进行说明:None    顾名思义,None表示此C++对象为纯自己定义的类,所有逻辑和与引擎的交互由开发人员自己实...

LUA环境搭建

LUA环境搭建

    本文针对Lua新手,介绍Lua开发环境的搭建。环境搭建目标语法高亮,自动补齐语法错误检查方法跳转lua脚本本地运行断点设置及调试功能编辑器选择    主流代码编辑器有vscode、rider、clion。其中下载链接:    Documentation for Visua...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。