第三次引擎编程尝试
本文用来介绍如何实现同步游戏状态给玩家,这里用到了前面介绍的HUD。
基本概念
HUD
游戏过程中,游戏系统和玩家交互是非常有必要的,UE4提供了HUD来实现将游戏系统状态同步给玩家的方式,也就是说HUD对于玩家来说是只读的;
UI
不同于HUD是将游戏系统状态同步给玩家,UI是用来提供一种将玩家意图传递给游戏系统的机制;
UMG
UMG是引擎提供的可视化UI创作工具,用来创建需要呈现给玩家的UI元素,可以是游戏里面的HUD、菜单等;所以后续我们的HUD的创建也是通过UMG来做的。
UMG的使用
UMG分为以下几部分:
(1)控件区罗列展示界面的空间结构
(2)控件区的组件直接拖拽到工作区,并在图层区进行层级编排
(3)工作区选中控件之后,在属性区进行控件的属性设置
(4)控件需要绑定执行流程,在属性区绑定之后在Graph
进行流程编辑
游戏中添加HUD
创建Widget Blueprint并编辑
游戏内预期效果是在角色没有拾取物品的时候显示文本
search diamond
,拾取之后变化文本search extract area
;拖动文本控件到工作区,并进行文本控件的编辑:
控件流程编辑
(1)变量区variable
定义变量GetObjective
和ExtractArea
,定义类型variable type
为Text
类型,并设置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
select node
用于返回指定下标index
的值,index
类型如图所示,可以是boolean
可以是integer
等;
在本例中index
为bool
类型,false
对应字符串GetObjective
,true
对应字符串ExtractArea
,index
值为IsCarryObject
的值,本质上即根据FPSTpl2Character->bIsCarryObject
的值返回对应的字符串。
return node
蓝图中自定义的函数中,遇到return node
会退出当前的执行流,并返回return value
的输入值,return node
的返回值为ReturnVal
并定义类型为Text
;
本例中return node
返回select node
的返回值,即根据bIsCarryObject
的值返回返回对应的字符串
添加控件到玩家视窗
通过上面的步骤,我们已经通过UMG完成玩家控件的编辑,下一步我们需要添加编辑好的控件到玩家视窗里面,此时就用到我们之前创建的HUD,并实例化之前创建的控件实例,如下:
这里用到了event graph
和AddToViewport
,分别进行介绍:
Event Graph
所谓event graph
是一种可视化的流程控制机制,可以让开发者针对特定的事件去定制化一些函数或者事件处理流程。本例针对的是BeginPlay
这个事件,即游戏开始时会抛出这个事件。所以本例的流程可以描述为,当游戏开始时,会创建一个WP_Widgt
实例,并添加到视图中AddToViewport
。
AddToViewport
AddToViewport
用于将指定的控件对象添加到游戏的视图,并填满整个游戏区域。
这里有一个viewport
和playerscreen
的区别需要关注,根据UE4官方文档的解释:所谓viewport
即一个你看你创建的游戏世界的窗口,和player screen
的区别在于,对于分屏类游戏,一个viewport
可能有多个screen
;于是有接口AddToPlayerScreen
可以将控件仅添加到viewport
的部分区域。
添加HUD到游戏设置中
进行完上述的步骤,我们运行游戏还是看不到所创建和设置的HUD,这是因为我们还没有把我们的HUD添加到游戏设置中,这里我们需要以下两个步骤:
第一步,创建GameMode并将我们创建的HUD绑定上去,如下图所示:
第二步:将我们创建的GameMode绑定到WorldSetting中,如下:
以上,运行游戏有如下效果:
参考资料
UE4-初学UMG(一) - 泠枫Jun - 博客园 (cnblogs.com)
Select | Unreal Engine Documentation