在UE4中,可以使用**Unreal Motion Graphics (UMG)**
创建**UI**
,UMG允许通过拖放UI元素(如按钮和文本标签)构建UI。
- 学习目标:
- 创建显示计数器和计时器的平时显示器(HUD)
- 显示 HUD
- 更新计数器和计时器以显示变量值
- 任务:创建一个显示两件功能的HUD
- 计数器:用于追踪玩家收集了多少个物体
- 计时器:显示形状停止之前剩余的秒数
- 要实现这些功能,需要使用
**Widgets**
**Widget**
是一个UI元素,它为UI提供某种视觉功能。Widget
本身不必可见,不可见的widget
也可以看到其效果widget
还可以包含其他小部件widget
也可以构造为整个界面,其界面上的UI元素也可以是widget
,包含在该widget
中。1.UMG UI设计器
- 创建流程:
Content Browser
—>UI文件夹
—>Add/Import
—>User Interface
—>Widget Blueprint
**UMG UI设计器**
由七个主要元素组成:
**Designer**
:此区域包含widget
的可视表示形式。通过按住鼠标右键并移动鼠标进行平移。通过滚动鼠标滚轮进行缩放。**Details**
:显示选择的widget
的属性**Palette**
:可使用的widget
列表,包括用户自行创建的widget
也将在此处**Hierarchy**
:当前选择的widget
的列表**Animations**
:此区域列出了所有的动画,widget
对某些属性可以进行动画处理,例如位置和大小**Timeline**
:显示选择动画的动画属性和关键帧**Editor Mode**
:在设计器和图形模式之间进行切换,图形模式与BluePrint
的Event Graph
几乎相同
2.创建控件
1.创建文本控件
Palette
—> Text
:文本控件非常适合显示数字信息,如计时器和计数器
- 在
Details
的顶部文本框内进行重命名操作 - 在
Details
的Anchors
对文本控件进行移动缩放操作 - 在
Details
的Appearance
-Font
对文本控件字体和字号进行更改 -
2.创建图形控件
Palette
—>Image
:创建图形控件Appearance
—Brush
—Image
更改图形形状
Appearance
—Slot(Canvas Panel Slot)
-Size To Content
将自动调整控件大小以适应其内容
在不同尺寸的屏幕上玩游戏时,UI需要相应的移动其控件。若要维护UI的布局,可以使用**Anchors/锚点**
3.锚点
Anchor定义了控件的位置,设置控件的位置时,其本质上就是在设置其相对于该锚点的位置
- 使用一个锚点时,可以确保UI在不同大小的屏幕上具有相同的布局
- 使用两个及以上的锚点时,可以自动调整控件的大小以保证其相对大小
**Anchor Medallion**
表示锚点
的位置,每当其选择控件时,锚点奖章
就会自动显示
- 更改锚点奖章位置,对应控件的位置就将更新为相对于锚点奖章位置
- 对此选项进行操作,将更改
**WBP_HUD**
的大小以匹配该选项,
4.显示HUD
在游戏开始时,
HUD
应当立即可见,因此可以使用Event BeginPlay
来执行此操作。
- 找到
Event BeginPlay
节点,在其节点链末尾添加**Create Widget**
来创建指定控件的实例 - 为
Construct NONE
的Class
指定WBP_HUD
。 - 要显示HUD,需要使用
**Add to Viewport**
节点,将**Create Widget**
的返回值与输出引脚与**Add to Viewport**
完成链接。回顾总结
- 一旦虚幻引擎调用
BP_GameManager
,Restart
和Set up Camera
功能将开始执行。这些函数设置了一些变量和相机。 Create Widget
节点创建WBP_HUD
Add to Viewport
节点将WBP_HUD
显示出来5.存储引用
要显示计数器和计时器的值,需要保存该信息的变量(TimeRemaining、ShapesCollected)。这些变量位于
BP_GameManager
,要使用这些变量,需要使用从WBP_HUD
访问BP_GameManager
的方法。而通过对变量中存储对BP_GameManager
的引用即可执行此操作。
1.创建变量
- 在
**WBP_HUD**
—**Graph**
—**My Blueprint**
创建名为**GameManager**
的变量 - 在
**Details**
—**Variable Type**
中将**Create Widget**
的Class设置为**BP_Game Manager**
并选择**Object Reference**
引用关系。 **Object Reference**
:引用其资源,其引用的类会被自动实例化加载到内存中-
2.设置引用
**Create Widget**
的**class**
选择为**WBP_HUD**
时,即:创建**WBP_HUD**
时执行
- 创建
**Self**
节点,并将其连接到**SET Game Manager**
,**Self**
节点将获取对**BP_GameManager**
的引用。 现在创建
**WBP_HUB**
时,它将对**BP_GameManager**
进行引用。6.功能
在蓝图中,函数是类似于事件图表的图形,与事件图表不同的是,函数可以被节点调用。
使用函数的原因:切换到
Graph
模式,在My Blueprint
界面,通过Functions
创建一个新的函数并将其命名为UpdateCounterText
。- 默认情况下,图形将包含一个输入节点。当函数开始时从输入节点开始
- 创建
**Get Shapes Collected**
节点来获取ShapesCollected变量,并将其与GameManager
变量进行连接。 - 创建
**SetText(Text)**
节点来设置文本,并将其与Counter Text
进行连接 - 由于
SetText(Text)
节点仅接受文本类型的输入,但ShapesCollected
变量的数据类型为Integer,不过将整数类型作为文本类型输入时,虚幻引擎自动创建**ToText(int)**
将其进行转换。 - 将输入节点连接到SetText(Text)节点完成更新函数的创建。
事件顺序:
- 当
Update Counter Text
被调用时,该函数将从BP_GameManager
获取Shapes Collected
变量 ToText(int)
节点将Shapes Collected
变量转换成Text
类型SetText(Text)
节点 把Counter Text
的文本设置为ToText(int)
的值。- 每当玩家收集形状时调用
UpdateCounterText
函数3.调用计数器更新函数
- 在游戏递增
ShapesCollected
后调用UpdateCounterText
函数 - 创建
IncrementShapesCollected
函数,使其递增计数器。每当形状与播放器重叠时,调用此函数。 - 在调用
UpdateCounterText
之前,需要对WBP_HUD
进行引用
BP_GameManager
中添加WBP_HUD
中设定的Text Widget
和Image
WBP_HUD
对BP_GameManger
有一个访问以引用其TimeRemaining
和ShapesCollected
进行引用在调用
UpdateCounterText
之前,需要一个对WBP_HUD
的引用- 该操作将
WBP_HUD
类的返回值(常量)升级为变量,将其重命名为HUDWidget
HUDWidget
的作用是为了引用MBP_HUD
中的SetText(Text)
函数
- 该操作将
- 添加
**UpdateCounterText**
节点,使**CounterText**
在游戏开始时显示**ShapesCollected**
的值 - 在
IncrementShapesCollected
函数界面对Update Counter Text
函数进行扩充,使其具备递增ShapesCollected的功能。而Update Counter Text
会将CounterText更新为ShapesCollected的值。
7.绑定
- 使用绑定可以自动更新某些控件的属性。若要进行绑定操,则该属性必须具有
Bind
下拉列表 - 可以将属性绑定到控件中包含的函数和变量。
Bind
将不断从函数或变量中获取值,然后它会将绑定属性设置为该值。 -
1.创建绑定
在
WBP_HUB
—Designer
—Details
—Content
中可以看到,**Text**
属性是可以进行绑定操作的**Create Binding**
会创建一个新的函数,并打开图形界面。将新创建的函数重命名为**UpdateTimerText**
**Return Node**
函数具有一个**Return**
节点,其返回值引脚类型为**Text**
,**TimeText**
将显示插入此引脚的任何文本。- 从
GameManager
节点中,获取TimeRemaining
变量并将其与Return Node
的Return Value
相连,虚幻引擎将自动添加一个转换节点。2.总结
- 绑定将不断调用
UpdateTimerText
函数(实质是绑定自动创建的函数) UpdateTimerText
函数将从BP_GameManager
中获取TimeRemaining
变量ToText(Float)
节点将值从TimeRemaining
转换为Text类型- 将转换后的值输出到
Return Node