第三次引擎编程尝试

ronald1年前职场7280

    本文用来介绍如何实现同步游戏状态给玩家,这里用到了前面介绍的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



相关文章

第二次引擎编程尝试

第二次引擎编程尝试

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

关于LUA(上)

    Lua是一种轻量小巧的脚本语言,C语言编写,并提供了易于使用的扩展接口和机制,易于嵌入到应用中,在游戏开发中经常被用来进行外层业务系统的开发。Lua的table    Lua的基本数据类型有八种,分别是:nil、boolean、number、string、userdata、function、thread 和 t...

关于LUA(下)

关于LUA(下)

Lua与OOP    Lua是面向过程的语言,不提供面向对象的特性,但是我们可以利用Lua的元表和元方法模拟面向对象的效果。OOP的特性封装    所谓封装,是隐藏对象的属性和细节,仅对外暴露公共的访问方式。本质上分为两层:    1)成员变量和成员方法,提升代码的内聚性,降低模...

K8S实战技巧(一)

一. 概述        K8S是谷歌开源的一个容器编排管理工具,可以帮助业务实现自动化部署、故障发现、容灾、扩缩容、流量管理等,大大提升业务的服务能力;k8s通过yaml描述文件实现容器的部署,本文介绍一些实际应用过程中可能用到一些k8s的特性及配置方法,适用于对k8s有一定了解的读者。二. 共享进程命名空间&nbs...

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

协程-无栈协程(下)

无栈协程库——protothread    ProtoThread源码如下所示:#define LC_INIT(s) s = 0; #define LC_RESUME(s) switch(s) { case 0: #define LC_SET(s)...

发表评论    

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