第三次引擎编程尝试

ronald7个月前职场4460

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



相关文章

协程-有栈协程(coroutine)

协程-有栈协程(coroutine)

概述    后台架构的微服务化,原先的单体应用被按照功能模块切分为若干进程组承担,此种架构演化带来的收益诸如:单进程复杂度降低,代码维护成本降低发布影响范围缩小,发布灵活性提升计算资源更精准的分配... ...    但是这种架构带来的另外的变化就是,原先由单进程承载的事务,可能涉及几个甚至十几个进程;在这种情况下,采...

K8S入门-概念篇(上)

K8S入门-概念篇(上)

    认识到K8S的产生背景之后,我们开始进一步了解K8S,基于对K8S里面一些概念的了解之后,我们再去探讨K8S的一些原理:一. node    如前所述,K8S是一个容器编排平台,即容器的自动部署、扩展和管理;其最终的落点是把容器调度到一个运行他的节点上,在K8S中这个运行容器的节点就是node,但是需要注意的是...

Lua的垃圾回收(上)

Lua 5.3版本的垃圾回收垃圾回收算法    垃圾回收算法一般分为两类:引用计数法和标记扫描法。引用计数法    所谓引用计数法,是指在为对象申请内存的时候,在分配的内存块预留一块区域用于存放这块内存被引用的次数,当被引用的时候增一,解引用的时候减一,当这块内存的引用次数降到0的时候,这块内存被认为不可访问,直接被回...

协程-无栈协程(下)

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

后台开发人员面试资源汇总(C&C++方向)

后台开发人员面试资源汇总(C&C++方向)

    汇总一下C/C++后台开发方向的学习资料,为避免广告之嫌,只罗列书名不贴链接了1.编程语言类《C++ Primer》《C 专家编程》《深度探索C++对象模型》《Effective C++:改善程序与设计的55个具体做法》《STL源码剖析》2.操作系统类《鸟哥的Linux私房菜 基础学习篇》《深入理解LINUX内核(第3版)》3.软件工程类《大话设计模...

Lua的Upvalue和闭包(二)

Lua的Upvalue和闭包(二)

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

发表评论    

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