UDN
Search public documentation:

GFxUDKFrontEndGuidecn
English Translation
日本語訳
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 用户界面 & HUD > Scaleform GFx > GFx UDKFrontEnd探究

GFx UDKFrontEnd探究


概述


本文一步步深入地解释了GFxUDKFrontEnd如何载入及显示与UDK一起发布的菜单的每个视图。

这个 simplified version(简化版本) 展示了使用菜单管理器进入和弹出两种视图(主菜单和选项)到一个视图堆栈所需的代码和资源。 它包括自定义文件和资源(以下没有包括,但是在处理上类似)。

ALERT! 注意: 将以下两行代码添加到DefaultEngine.ini中的 [Engine.PackagesToForceCookPerMap] 。

DefaultEngine.ini
.Map=SF-FrontEnd
.Package=SFSandbox

所涉及到的文件


所涉及到的虚幻脚本文件

  • The Menu Manager(菜单管理器) - \Development\Src\UTGame\GFxUDKFrontEnd.uc
  • 视图- \Development\Src\UTGame\GFxUDKFrontEnd_MainMenu.uc , *Multiplayer.uc, *Settings.uc, etc.
  • 视图的基类 - Development\Src\UTGame\GFxUDKFrontEnd_Screen.uc
  • 基础视图类 - \Development\Src\UTGame\GFxUDKFrontEnd_View.uc

所涉及到的Flash文件

  • 管理器- \UDKGame\Flash\UDKFrontEnd\udk_manager.fla
  • 视图 - \UDKGame\Flash\UDKFrontEnd\udk_main_menu.fla, *multiplayer.fla, *settings.fla, etc.
  • 所有从该文件中拖曳出来的图形物件 - \UDKGame\Flash\UDKFrontEnd\udk_assets.fla

所涉及到的动作脚本文件

  • 视图 - - \UDKGame\Flash\ActionScript\com\scaleform\udk\view s\MainMenuView.as, MultiplayerView.as, SettingsView.as等。
  • 管理器 - \UDKGame\Flash\ActionScript\com\scaleform\udk\mana gers\MenuManager.as
  • 注册一个文件的类的工具 \UDKGame\Flash\ActionScript\com\scaleform\udk\util s\UDKUtils.as

其它文件

  • \UDKGame\Config\DefaultUI.ini
  • \UDKGame\Content\Maps\UT3\UDKFrontEndMap.udk

GFxUDKFrontEnd.uc是针对前端(菜单)的专业类(或管理器)。 通过Open GFx Movie(打开GFx短片)在Kismet里的起始关卡(UDKFrontEndMap)中调用它。 所加载的短片如下: UDKFrontEnd.udk_manager,并且已将Movie Player Class(视频播放器类)设置为GFxUDKFrontEnd。 Take Focus(聚焦), Capture Input(输入侦测)以及Display With Hud Off(关闭使用Hud显示)都被选中。

  • GFxUDKFrontEnd’s的SWF在defaultproperties(默认属性)中被定义为: UDKFrontEnd.udk_manager
  • udk_manager.FLA/SWF被赋予的文档类为: com’scaleform.udk.managers.MenuManager (MenuManager.as)
    • MenuManager.as初始化 _viewStack列并提供视图栈的渐变(动画)的几个函数。
    • udk_manager.FLA包含了空白的短片片段: 管理器类型:管理器。本短片片段将会用来保持视图。

GFxUDKFrontEnd调用栈


  • 创建查看信息数据结构
    • ViewName, SwfName,DependantViews
    • 这些值将会由DefaultUI.ini中的数据进行填充
  • 创建ViewInfo型的ViewData[]列
    • DefaultUI.ini所定义的+ViewData行
  • Start() 被执行
    • 调用 ConfigFrontEnd()
  • ConfigFrontEnd() 被执行
    • udk_manager.fla的“_root” 缓存在RootMC
    • udk_manager.fla的“manager” 缓存在ManagerMC

  • Start() 调用 LoadViews()
  • LoadViews() 被执行
    • LoadView() 调用, ViewData[] 列各元素传递
  • LoadViews() 被执行
    • 新的空白短片片段在ManagerMC内被创建,使用的名字为: SomeViewNameContainer(例如MainMenuContainer, MultiplayerContainer, HostGameContainer等)
      • 而且这个新的短片剪辑是由ViewContainer引用的。
    • 新的空白短片剪辑则在ViewContainer内创建并命名为: SomeViewName.
      • 这个新的短片剪辑由ViewLoader引用。
    • 我们得到了SWFName并作为字符串存为asvals的 args[] 列元素0.
    • 然后我们在ViewLoader调用 “loadMovie” (GFxObject中的标准Flash函数),通过args[]列将SWFName传递给它。
      • 这就把视图的实际SWF文件作为新的短片剪辑载入了ViewLoader的短片剪辑。
      • SWF文件设立文件类(例如:com.scaleform.udk.views.MainMenuView (MainMenuView.as))
      • SWFs包含了类型容器的空白电影剪辑,实例名称为 “container”
        • “container” 内部存在通过运行共享载入的另一个短片剪辑。 比如“udk_main_menu.fla” 拥有类main_menu的 “main_menu” 的短片剪辑
          • 这些短片剪辑通过udk_assets.swf的运行分享被导入SWF
          • UDK_assets.swf 包含了库里所有的视图,且每张视图都在属性中被设置为可导出到运行分享。
      • 新载入的SWF文件触发CLIK WidgetInitialized事件
    • 最后,我们把视图的名称加入到LoadedViews[] 列。
  • WidgetInitialized() 为每个载入的视图在其载入时执行。
    • 示例: 主菜单
      • MainMenuView由GFxUDKFrontEnd_MainMenu类创建
      • 调用 ConfigureView()
      • ConfigureView() 被执行
        • SetWidgetPathBinding() 被调用-此函数设置为在视图路径内所有找到的子项控件将会把initCallBack事件发送到视图的 WidgetInitialized() 处理器。
          • 这需要在绑定控件的默认属性里使用SubWidgetBindings.Add而不是常用的WidgetBindings.Add。
      • 调用 ConfigureTargetView() (只用于MainMenuView)
  • ConfigureTargetView() 被执行(第一视图? 主菜单)
    • 本函数首先测试看视图是否已在栈上。
    • 调用 OnViewActivated() (在GFxUDKFrontEnd_View.uc中可找到)
    • 调用 OnTopMostView() , 传入true.
      • OnTopMostView() 播放打开的动画并设置ESC键的代理键。
    • 增加视图到UnrealScript的ViewStack[]列。
    • 调用 PushView() .
  • PushView() 被执行
    • 在MenuManager.as中触发ActionScript函数 pushStandardView() 将它传送到新的视图。

MenuManager调用栈


  • pushStandardView() 被执行
    • 调用 pushViewImpl()
  • pushViewImpl() 被执行
    • 新视图渐变。
    • 将新视图放入 AS的 _viewStack[] 列。

弹出视图


当视图从viewstack处弹出, 正如当按下BACK从多人屏幕回到主菜单时,常用的函数为:

  • PopView()
  • PopViewStub()

  • 每个屏幕都有 "Back" 按钮。 Back按键与defaultproperites的GFxUDKFrontEnd_Screen.uc绑定。

Unrealscript
defaultproperties
{
  // General
  SubWidgetBindings.Add((WidgetName="list",WidgetClass=class'GFxClikWidget'))
  SubWidgetBindings.Add((WidgetName="back",WidgetClass=class'GFxClikWidget'))

  AcceptButtonImage="pc_enter_png"
  CancelButtonImage="pc_esc_png"
  AcceptButtonHelpText="SELECT"
  CancelButtonHelpText="BACK"
}

  • 在GFxUDKFrontEnd_Screen.uc的 WidgetInitialized() 处理器,Back键设定为监听 'CLIK_press' 事件,并在按下后执行 Select_Back() :

虚幻脚本
case ('back'):
  BackBtn = GFxClikWidget(Widget.GetObject("btn", class'GFxClikWidget'));
  BackBtn.SetString("label", "BACK");
  BackBtn.AddEventListener('CLIK_press', Select_Back);
  BackBtn.AddEventListener('CLIK_focusIn', FocusIn_BackButton);
  bWasHandled = true;
  break;

  • 事件处理器 Select_Back() 可在GFxUDKFrontEnd_View找到。 它会触发函数 MoveBackImpl():

Unrealscript
function Select_Back(GFxClikWidget.EventData ev)
{
  MoveBackImpl();
}

  • MoveBackImpl() 从菜单管理器(GFxUDKFrontEnd.uc)中执行 PopView()

Unrealscript
function MoveBackImpl()
{
  if (MenuManager != none)
  {
    PlayCloseAnimation();
    MenuManager.PopView();
  }
}

  • PopView() 将目前视图从ViewStack[] 列移除。

Unrealscript
ViewStack.Remove(ViewStack.Length-1, 1);

  • 然后它会执行前一视图的 OnTopMostView() 函数(前一视图成为当前视图)。

Unrealscript
ViewStack[ViewStack.Length-1].OnTopMostView( false );

  • 最后,当它返回数值时会执行 PopViewStub() 函数。
  • PopViewStub() 执行MenuManager.as内的 popView() ActionScript函数
  • 然后 popView() 执行 popViewImpl() 渐出短片。

下载


  • 下载GFxUDKFrontEnd的简化版本。