UI布局系统

游戏布局系统概述 🎮

1️⃣ 概述

一个游戏可以有多个玩家一起玩,每个玩家有一个属于自己的画面(UI布局)展示所有的UI内容。

每一个布局中会有多个层次的内容在不同的情况下展示/隐藏/相互覆盖。

而布局系统则是为了方便地管理这些内容。

2️⃣ 准备你的游戏布局

定位到 ProjectSettings -> Game -> Generic UI System Settings,在这里选择你的UI策略。

guis layout 1

游戏UI策略只是一个简单的蓝图,用于引用具体的游戏布局Widget。

你可以新建一个蓝图,继承自 GUIS_GameUIPolicy 来创建新的策略。

guis layout 2


3️⃣ 布局内容

WB_GUI_GameUILayout 为例,它只是一个空的,继承自 GUIS_GameUILayout 的 Widget 蓝图。

guis layout 3

其中,该布局设置了四个 CommonActivatableWidgetStack 用于表示不同的UI层,越往下的UI层拥有越高的显示优先级。

Stack

UI层标记

描述

GameLayer_Stack

GGF.UI.Layer.Game

一般游戏的HUD内容会显示在这一层。

GameMenu_Stack

GGF.UI.Layer.GameMenu

与游戏相关的“菜单”,例如游戏内的库存界面。

Menu_Stack

GGF.UI.Layer.Menu

类似于设置屏幕、系统设置的内容。

Modal_Stack

GGF.UI.Layer.Model

确认对话框、错误对话框等。


并在 EventGraph 中通过如下代码将每一个UI层与不同的游戏标签关联起来。

guis layout 4


每一个UI层本质上是一个 ActivatableWidgetStack,你可以将任何 Widget 添加(Push)和移除(Pop/Deactivate)到不同的UI层。例如,将新的 Widget 添加到 GameMenu 层时,该层原有的 Widget 会停止显示,并显示新的用户界面,直到新的用户界面被移除。

如果将新的 Widget 放入完全不同的层,如 Menu 层,该Widget则会覆盖在 GameGameMenu 层。因为每一个UI层都是单独的 WidgetStack。

此游戏UI布局,基本上能涵盖大多数游戏的需求。如果你的游戏有特殊的需求,你完全可以参考此布局,构建属于你自己的独一无二的游戏布局,并使用你自己的层标记。

4️⃣ 为玩家初始化UI布局

在 UnrealEngine 中,无论是多人模式还是本地分屏模式,每一个 PlayerController/LocalPlayer 都在本机拥有属于自己的 AHUD 对象用于展示UI。因此,HUD 是一个初始化玩家UI的最佳切入点。

每一个玩家都有自己的UI,有自己的布局,因为我们需要在每个玩家的HUD中,请求UI子系统为自己创建UI布局。

guis layout 5


这样每一个玩家进入游戏后,就会自动将配置好的布局加入到视口。

5️⃣ 操纵UI层

当UI布局被添加到玩家视口后,你就可以使用如下API往不同的UI层添加不同的内容了。


guis layout 6

比如你有一个Widget用于展示HUD元素,你就可以将其添加到 Layer.Game 对应的UI层。


guis layout 7


要从UI层移除Widget,一般是在Widget内部操作。

guis layout 8

用这几个简单的API,你可以操纵很复杂的UI层级,比如:

  • HUD
  • 暂停菜单
  • 设置菜单
  • 游戏设置
  • 操纵设置

⚠️ 注意:能被推送到的UI层的Widget必须继承自 CommonActivatableWidget

6️⃣ UI策略的用途

UI策略主要用于确定游戏的布局,并管理一个游戏进程内的多个 LocalPlayer 以及玩家对应的UI布局关系。

在单机游戏中,通常只有1个 LocalPlayer