GameUI
< Zh
Jump to navigation
Jump to search
- 不要与 game_ui 实体混淆
GameUI 是提供 VGUI "前端" 的代码:广泛地说,主菜单还有加载界面的代码。
GameUI面板是其专用面板 ("GameUI Panel") 的子对象。 客户端的 RootPanel 只用于游戏里的HUD元素。
起源2004 到 起源2013

Source 2009 的GameUI。闭源。
在Source引擎的原始分支中 (从 Source 2004 到 橙盒 ),GameUI是一个封闭的引擎库,只能通过编辑 res 脚本文件进行有限地操作。这些脚本定义了宽度、高度、元素位置等属性,开发者可以添加新的非交互元素,并通过一定技巧隐藏现有元素。
开发者能够 创建新的VGUI面板 ,其行为与GameUI原生面板完全一致。从 Source 2013 引擎开始 (该版本采用了 军团要塞2 的组件),此类面板可通过 覆盖 默认主菜单实现自定义—— IGameUI 接口为此新增了四个专用函数。
求生之路 到 异形丛生 引擎分支

求生之路分支 的GameUI。异形丛生的SDK提供了代码。
异形丛生 SDK 包含了新版L4D风格GameUI的完整源代码,该UI系统已被移至客户端库中。其设计针对主机平台(无指向设备)进行了重构:所有功能被整合到同一套可导航菜单系统中,用户无法同时操作多个区域。其编程实现也大幅简化。

创建一个新的窗口
- 新建一个继承自
CBaseModFrame
的类。 - 在
game\resource\ui\basemodui\
目录下创建对应的 "<class name>.res" 脚本。 - 在
WINDOW_TYPE
enum(【术语】枚举)中添加新条目。 - 修改
CBaseModPanel::OpenWindow()
中庞大的switch语句,加入新枚举和类。
这种笨拙的枚举/switch indirection的设计,大概是为了让单个"窗口类型"值能根据UI状态打开不同窗口对象——遗憾的是Valve至今没有实际应用过!
窗口打开机制
使用代码 CBaseModFrame* CBaseModPanel::OpenWindow()
:
#include "gameui\swarm\basemodpanel.h"
using namespace BaseModUI;
void openwindow()
{
CBaseModFrame* mainMenu = CBaseModPanel::GetSingleton().GetWindow( WT_MAINMENU );
CBaseModPanel::GetSingleton().OpenWindow( WT_GAMESETTINGS, mainMenu );
}
参数说明如下:
WINDOW_TYPE &wt
- 定义具体打开哪个窗口的枚举值。
CBaseModFrame * caller
- 发起打开请求的父窗口,除其他作用外,新窗口的 ""back"" 按钮将指向该对象。
bool hidePrevious
- 若为true则隐藏
caller
窗口。 KeyValues * pParameters
- 传递给新窗口的参数集。
新窗口打开时会触发 OnOpen()
函数的调用。
启动
初始化顺序为:
CGameUI::Initialize()
CBaseModPanel::RunFrame()
CBaseModPanel::OnGameUIActivated()
CBaseModPanel::OpenFrontScreen()
CBaseModPanel::OpenWindow()
CBaseModPanel
是单例对象; CBaseModFrame
是所有窗口的基类。