UDN
Search public documentation:

GFxUDKFrontEndGuideKR
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 이해하기


문서 변경내역: James Tan 작성. 홍성진 번역.

개요


GFxUDKFrontEnd 가 UDK 에 포함된 메뉴의 각 뷰를 어떻게 로드하고 표시하는지를 하이 레벨 관점에서 단계별로 알아보는 설명서입니다.

메뉴 매니저를 사용하여 뷰 스택에 (메인 메뉴와 옵션) 두 가지 뷰를 push / pop 하는 데 필요한 코드와 애셋에 대해서는, 단순화된 버전을 통해 자세히 확인할 수 있습니다. 커스텀 파일과 애셋이 들어 있습니다. (여기서 다루지는 않겠지만, 실행은 비슷합니다.)

ALERT! 주: DefaultEngine.ini 의 [Engine.PackagesToForceCookPerMap] 아래에 다음 두 줄을 추가합니다.

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

관련 파일


관련된 UnrealScript 파일

  • The Menu Manager - \Development\Src\UTGame\GFxUDKFrontEnd.uc
  • The Views - \Development\Src\UTGame\GFxUDKFrontEnd_MainMenu.uc , *Multiplayer.uc, *Settings.uc, etc.
  • Base class for Views - Development\Src\UTGame\GFxUDKFrontEnd_Screen.uc
  • Base View class - \Development\Src\UTGame\GFxUDKFrontEnd_View.uc

관련된 Flash 파일

  • The Manager - \UDKGame\Flash\UDKFrontEnd\udk_manager.fla
  • The Views - \UDKGame\Flash\UDKFrontEnd\udk_main_menu.fla, *multiplayer.fla, *settings.fla, etc.
  • All graphical assets pulled from this file - \UDKGame\Flash\UDKFrontEnd\udk_assets.fla

관련된 ActionScript 파일

  • The Views - \UDKGame\Flash\ActionScript\com\scaleform\udk\view s\MainMenuView.as, MultiplayerView.as, SettingsView.as, etc.
  • The Manager - \UDKGame\Flash\ActionScript\com\scaleform\udk\mana gers\MenuManager.as
  • Utlility for registering a document's class - \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 를 통해 스타트업 레벨에서 호출됩니다. 거기서 로드되는 무비는 UDKFrontEnd.udk_manager 이고, Movie Player Class 는 GFxUDKFrontEnd 로 설정되어 있습니다. Take Focus, Capture Input, Display With Hud Off 모두 체크되어 있습니다.

  • GFxUDKFrontEnd 의 SWF 는 defaultproperties 에 UDKFrontEnd.udk_manager 로 정의되어 있습니다.
  • udk_manager.FLA/SWF 의 다큐먼트 클래스는 com'scaleform.udk.managers.MenuManager (MenuManager.as) 로 주어졌습니다.
    • MenuManager.as 는 _viewStack 배열을 초기화(initialize)시키고, 뷰스택 트위닝(애니메이션)을 위한 함수를 여럿 제공합니다.
    • udk_manager.FLA 에는 type: manager 인 비어있는 movieClip: manager 가 들어 있습니다. 이 무비클립은 뷰를 담는 데 사용됩니다.

GFxUDKFrontEnd 콜스택


  • ViewInfo 데이터 구조체를 만듭니다.
    • ViewName, SwfName, DependantViews
    • 이 값들은 DefaultUI.ini 의 데이터로 채워집니다.
  • ViewInfo 형 ViewData 배열을 만듭니다.
    • +ViewData 줄은 DefaultUI.ini 에 정의됩니다.
  • Start() 가 실행됩니다.
    • ConfigFrontEnd() 를 호출합니다.
  • ConfigFrontEnd() 가 실행됩니다.
    • udk_manager.fla 의 "_root" 가 RootMC 에서 캐시됩니다.
    • udk_manager.fla 의 "manager" 가 ManagerMC 에서 캐시됩니다.
  • Start()LoadViews() 를 호출합니다.
  • LoadViews() 가 실행됩니다.
    • ViewData[] 배열의 각 요소 (각 뷰)를 전달하여 LoadView() 를 호출합니다.
  • LoadView() 가 실행됩니다.
    • SomeViewNameContainer 라는 이름으로 ManagerMC 안에 빈 무비클립이 새로 생깁니다. (예: MainMenuContainer, MultiplayerContainer, HostGameContainer, 등.)
      • 이 새로 생긴 무비클립은 ViewContainer 에 의해 리퍼런스됩니다.
    • 그런 다음 SomeViewName 이라는 이름으로 ViewContainer 안에 빈 무비클립이 새로 생깁니다.
      • 이 새로 생긴 무비클립은 ViewLoader 에 의해 리퍼런스됩니다.
    • SWFName 을 구한 다음 asvals 의 args[] 배열 0 요소에다 string 으로 보관합니다.
    • 그런 다음 ViewLoader 상의 "loadMovie" (GFxObject 의 표준 Flash 함수)에다 args[] 배열을 통해 SWFName 을 전달하여 invoke 합니다.
      • 그러면 해당 뷰에 대한 실제 SWF 파일을 ViewLoader 무비 클립 속에다 새로운 무비 클립으로 로드합니다.
      • SWf 파일은 자신의 다큐먼트 클래스를 설정합니다. (예: com.scaleform.udk.views.MainMenuView (MainMenuView.as))
      • SWF 에는 인스턴스 이름이 "container" 인 container 형 빈 무비 클립이 담깁니다.
        • "container" 안에는 런타임 셰어링을 통해 로드되는 다른 무비 클립이 있습니다. 예를 들어 "udk_main_menu.fla" 에는 main_menu 형의 "main_menu" 무비클립이 있습니다.
          • 이 무비클립은 udk_assets.swf 에서의 런타임 셰어링을 통해 SWF 속으로 임포트된 것입니다.
          • UDK_assets.swf 에는 라이브러리에 있는 모든 뷰가 들어 있으며, 각 뷰는 런타임 셰어링 용으로 익스포트되도록 프로퍼티 설정되어 있습니다.
      • 새롭게 로드되는 SWF 는 CLIK WidgetInitialized 이벤트를 발동시킵니다.
    • 마지막으로 뷰의 이름을 LoadedViews[] 배열에 추가합니다.
  • 로드가 되면 로드된 각각의 뷰에 대해 WidgetInitialized() 가 실행됩니다.
    • 예: MainMenu
      • GFxUDKFrontEnd_MainMenu 형의 MainMenuView 가 생성됩니다.
      • ConfigureView() 를 호출합니다.
      • ConfigureView() 가 실행됩니다.
        • SetWidgetPathBinding() 가 호출됩니다. 이 함수는 뷰의 경로에서 찾은 모든 자손 위젯이 자신의 initCallBack 이벤트를 뷰의 WidgetInitialized() 핸들러에 전송할 수 있도록 설정합니다.
          • 이를 위해서는 위젯을 바인딩시 defaultproperties 안의 일반적인 WidgetBindings.Add 대신 SubWidgetBindings.Add 를 사용해야 합니다.
      • (MainMenuView 에 대해서만) ConfigureTargetView() 를 호출합니다.
  • (첫 뷰 - 메인 메뉴에 대해서) ConfigureTargetView() 가 호출됩니다.
    • 이 함수는 우선 뷰가 스택에 있는지 없는지부터 확인합니다.
    • (GFxUDKFrontEnd_View.uc 에서 찾은) OnViewActivated() 를 호출합니다.
    • OnTopMostView() 에 참을 전달하여 호출합니다.
      • OnTopMostView() 는 열린 애니메이션을 재생하고, 이스케이프 키 델리게이트를 설정합니다.
    • 뷰를 UnrealScript ViewStack[] 배열에 추가합니다.y.
    • PushView() 를 호출합니다.
  • PushView() 가 실행됩니다.
    • MenuManager.as 에 있는 ActionScript 함수 pushStandardView() 에다 새로운 뷰를 전달하여 발동시킵니다.

MenuManager 콜스택


  • pushStandardView() 가 실행됩니다.
    • pushViewImpl() 를 호출합니다.
  • pushViewImpl() 가 실행됩니다.
    • 새로운 뷰를 자리에 트위닝합니다.
    • 새로운 뷰를 AS 의 _viewStack[] 배열 상에 푸시합니다.

뷰 "뽑아내기" (popping)


멀티플레이어 화면에서 메인 메뉴로 가기 위해 Back 버튼을 누른다든가 해서, 뷰스택에서 뷰를 "뽑아" (pop off) 낼 때 핵심적으로 사용되는 함수는 다음과 같습니다:

  • PopView()
  • PopViewStub()

  • 각 화면에는 "Back" 버튼이 있습니다. Back 버튼은 GFxUDKFrontEnd_Screen.uc 의 defaultproperties 에 묶여 있습니다:

Unrealscript
defaultproperties
{
  // 일반
  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() 를 실행하라고 되어 있습니다:

Unrealscript
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() 는 MenuManager (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 에서 찾을 수 있는 ActionScript 함수 popView() 를 실행합니다.
  • 그런 다음 popView() 는 무비를 트위닝하는 popViewImpl() 를 실행합니다.

내려받기