GUI是指Graphical User Interface,为玩家显示并广播重要信息。在这一章中,我们将设置一个GUI,用于跟踪显示玩家的血条、体力和弹药,并且我们将设置一个计数器。我们使用UMG UI编辑器来创建UI元素。
3.1 使用UMG创建简单的UI
为了创建显示玩家血条、体力和弹药数值,我们首先要创建可以跟踪这些数值的变量。 我们进入FirstCharacter蓝图,在这个蓝图中,我们要定义代表玩家状态的变量。
我们创建一个变量PlayerHealth,然后选中这个变量。在细节面板中将变量类型改为浮点型。
然后将其改为可修改。同样的,我们创建浮点型的PlayerStamina和整型的PlayerCurrentAmo。最后还有整型的TargetKillCount。 然后我们分别对其设置默认值。
3.1.1 使用蓝图控件绘制形状
由于FPS的模板没有UI元素,我们需要新建一个文件夹来存储GUI内容。然后我们创建控件蓝图,命名HUD。
我们进入蓝图中,在编辑器的左边可以看到控制板(palette)面板,展开面板分类。我们可以看到一系列的容器列表。这些容器可以用来组织UI。找到Horizontal Box(水平框),选中它后将它从控制板中拖到层次结构中的画布面板下。然后我们拖入两个垂直框,嵌入到水平框下。
然后我们拖入文本框和进度条,形成如下图所示的结构:
3.1.2 自定义血条和体力条的外观
我们希望UI元素能显示在屏幕上。在图形视口中,突出显示的大矩形框标示玩家视野的屏幕边界为画布。我们在细节面板中,调整进度条和文字框的大小。调整尺寸下为填充,然后选择颜色和对齐方式。
然后我们调整UI和屏幕边缘的锚点。我们希望UI元素能随着屏幕尺寸的变化仍在同样的相对位置上,锚点用于定义画布上控件的位置,并且可以适配屏幕尺寸。
3.1.3 创建弹药和敌人计数
我们现在着手弹药的计数和游戏目标显示,这个与之前的过程类似,只是将进度条替换数值。
我们创建Ammo:30和Targets Eliminated:0这两个,分别位于中间和右上角两个位置。
3.1.4 显示HUD
我们回到FirstPerson Character中,右击创建BeginPlay节点,然后放置触发器(现在版本的这个节点已经被创建,我们直接使用,断开和其他节点的连接但是不要删除)。
我们创建如下节点,然后连接起来。
这样我们成功的在上面创建了HUD,接下来我们要互动的改变这些值。
3.2 关联玩家变量与UI元素值
为了使我们的UI元素能够获取玩家的变量值,需要到内容浏览器->UI,再次打开HUD控件蓝图进行设置。
3.2.1 为health和stamina创建绑定
为了让UI元素显示的数据和玩家player状态保持更新,我们要创建一个绑定。在HUD蓝图编辑器中,选中层次面板中的Health Bar,在Process中,选中Percent属性的创建绑定。
我们首先添加一个Get Player Character节点,然后从return value拖出一个引线,添加一个类型转换为FirstPersonCharacter节点并与之相连接。形成下面的节点:
备注:
- 这个节点组合在HUD蓝图类中检索玩家角色。然而,在FirstPersonCharacter蓝图中,我们为玩家角色创建的任何自定义的函数或变量将仍然禁止访问角色,直到我们将玩家角色对象转换为FirstPersonCharacter蓝图。需要记住的是:类型转换操作用于检查和确保输入对象是希望转换成的特殊对象。因此,前面的节点组合重点提出:如果玩家角色是一个第一人称角色,则允许我们访问FirstPersonCharacter函数和变量并绑定到那个玩家角色。
接着,我们添加一个获得Player Health节点。最后,我们连接相应的节点:
上面这些操作时连接health变量和UI中health进度条的所有操作。对于stamina变量,我们也进行同样的操作。这样我们测试一下,已经变成了红条和绿条。
下一步就是绑定Ammo count和Goal counters。
3.2.2 制作文本绑定
这次我们选中Ammo Left文本对象,同样创建绑定。然后创建如下的节点:
最后一个是为了GoalTracker目标计数创建绑定。
接着我们需要创建事件来触发变量的改变。
3.3 获得子弹和摧毁目标的信息
为了让UI元素能够反映玩家在游戏世界中的交互信息,我们需要修改控制玩家和目标的蓝图。首先获取玩家在射击时子弹计数递减(ammo counter)的信息。
3.3.1减少子弹计数
FirstPersonCharacter蓝图管理玩家的开火信息,我们进入蓝图中找到Spawn projectile的模块。我们需要实现的功能是,射击一次后对当前弹药数量值减1。我们到这个模块的最右边,然后实现下面的连接:
现在我们进入测试,子弹数量已经可以减1了。
3.3.2 增加已摧毁物体的计数
这部分暂时略过。
4 总结
在本章中,我们制作一个可以获取玩家与游戏世界交互信息的HUD增强了游戏体验。通过这些操作,建立了玩家与游戏的通信。到现在为止,我们我们已经简历第一人称射击游戏的架构,包括射击、目标和爆炸效果,以及为显示游戏状态的UI。
之后我们将开始从建设游戏架构过度到游戏设计部分。任何游戏的核心都是创建玩家们能够获取有趣的游戏体验的规则,虽然目前游戏中已经能够对射击做出基本的响应,但是整体缺少一个让玩家完成的终极目标。我们将通过建立一个玩家的胜利条件来纠正这一现状,同时提供额外的限制,使得游戏体验的功能更加全面。