UE5 Lyra项目UI框架拆解

1

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-1-19 12:52:51 | 显示全部楼层
一.文章简介

Lyra项目中的UI功能主要由游戏UI管理子系统(GameUIManagerSubsystem)游戏UI策略(GameUIPolicy)游戏布局UI(PrimaryGameLayout)三个部分构成UI框架,CommonUI插件以及UIExtension插件负责UI层面的使用。这篇文章旨在介绍Lyra项目中UI框架是如何搭建配置,框架运行流程等,关于UI层面的使用会在后续文章中讲述。
二.CommonGame插件

1.插件扩展

在Lyra项目的插件目录中有一个CommonGame插件,封装了一些游戏通用基类,Lyra项目中的UI相关类在此基类上继承并根据项目扩展功能。所以我们可以将CommonGame插件放入自己的项目中,学习Lyra的方式继承所需要的类。由于CommonGame插件又依赖于CommonUser插件以及ModularGameplayActors插件,所以我们需要将这两个插件也放入自己项目的插件目录中。



CommonGame插件依赖于CommonUser插件以及ModularGameplayActors插件。



将Lyra项目中所需插件复制进自己项目的插件目录中。



CommonGame插件目录结构

与UI相关的类在Lyra项目中的继承关系如下:
B_LyraGameInstance(蓝图) -> LyraGameInstance -> CommonGameInstance ->GameInstance
LyraLocalPlayer -> CommonLocalPlayer ->LocalPlayer
LyraPlayerController -> CommonPlayerController -> ModularPlayerController -> PlayerController
LyraUIManagerSubsystem -> GameUIManagerSubsystem ->GameInstanceSubsystem
B_LyraUIPolicy(蓝图) -> GameUIPolicy -> Object
W_OverallUILayout(蓝图)-> PrimaryGameLayout -> CommonUserWidget(CommonUI插件中的类)

2.插件扩展后配置

注意:需要在配置里修改GameInstance和LocalPlayer的初始类;



配置GameInstance类,  B_LyraGameInstance 为 LyraGameInstance 的蓝图继承类。



配置LocalPlayer类。



PlayerControllerClass需要是CommonPlayerController或其子类。

三.游戏UI管理子系统(GameUIManagerSubsystem)

1.判断创建哪一个游戏UI管理子系统





在ShouldCreateSubsystem函数中会判断子系统是否有子类,如果没子类就创建该子系统,有子类就不创建该子系统,由于Lyra项目创建了LyraUIManagerSubsystem并继承GameUIManagerSubsystem,所以项目会创建LyraUIManagerSubsystem而不会创建GameUIManagerSubsystem.


2.配置GameUIPolicy(游戏策略)类




游戏UI管理子系统

在游戏UI管理子系统中有一个GameUIPolicy(游戏策略)类的配置项,配置位置在DefaultGame.ini文件中


3.创建GameUIPolicy(游戏策略)对象




在子系统初始化函数中会创建GameUIPolicy对象。

4.LyraUIManagerSubsystem的扩展







在LyraUIManagerSubsystem添加了Tick函数,并根据AHUD的bShowHUD布尔值决定游戏布局UI的显示与隐藏。
四.游戏策略对象(GameUIPolicy)






游戏主UI布局类配置项

在GameUIPolicy(游戏策略)中,有一个游戏主UI布局类的配置项, Lyra创建B_LyraUIPolicy蓝图类并配置游戏主UI布局类。



在蓝图中配置游戏主UI布局类。

五.游戏布局UI(PrimaryGameLayout)



/**
* The primary game UI layout of your game.  This widget class represents how to layout, push and display all layers
* of the UI for a single player.  Each player in a split-screen game will receive their own primary game layout.
*/
/**
* 游戏的主要游戏 UI 布局。这个widget类表示如何布局,推送和显示所有层
* 单个玩家的 UI。分屏游戏中的每个玩家都会收到自己的主要游戏布局。
*/



Lyra项目中的游戏布局UI

这就是游戏的布局UI,在这个UI中会添加不同的栈UI控件,来达到UI分层的目的。Lyra项目中将UI分为游戏层,游戏菜单层,菜单层,modal层。至于如何将UI加入等涉及到CommonUI插件的知识,后续文章再讲解。
六.创建游戏布局UI(PrimaryGameLayout)的流程




在CommonGameInstance的AddLocalPlayer函数中,会调用GameUIManagerSubsystem的NotifyPlayerAdded函数,所以需要配置GameInstance类为CommonGameinstance类或其子类,同时这里转换检测LocalPlayer是否为CommonPlayer类,所以需要配置LocalPlayer类为CommonLocalPlayer或其子类。



在GameUIManagerSubsystem的NotifyPlayerAdded函数调用GameUIPolicy的NotifyPlayerAdded函数。



在GameUIPolicy的NotifyPlayerAdded函数中会绑定LocalPlayer的OnPlayerControllerSet委托来创建游戏布局UI。



在CommonPlayerController的ReceivedPlayer函数中会广播OnPlayerControllerSet委托。



所以PlayerControllerClass需要是CommonPlayerController或其子类。



加载配置的路径,创建游戏布局UI对象。



将游戏布局UI显示在屏幕上。

七.文章结尾:

下面是自己个人的一些见解,供参考:
GameUIManagerSubsystem负责GameUIPolicy的配置管理、生命周期等;
GameUIPolicy负责PrimaryGameLayout的配置管理、生命周期等;
PrimaryGameLayout负责游戏中UI的分层布局等;
游戏中UI的分层布局等知识涉及CommonUI插件以及UIExtension等插件的使用,后续会出文章讲述示例。
------------------2023.1.13
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表