2015년 1월 18일 일요일

[uFrame 1.5] Diagram에서 일일히 connect하지 않고 직접 transition하기

개요

사실 다이어그램을 사용해서 플로우를 정리하는 것을 전제로하는 프레임워크에서 이런 설정은 사용에 따라 독이 될수도 있지만, 어떤 구조에서는 이 일일히 연결하는 작업이 오히려 구성에 있어서 중첩구현, 구조의 복잡화 등을 야기할 수 있다고 생각이 된다.

따라서 diagram에서 scene transition 설정을 일일히 설정하지 않고 암묵적으로 고정값으로 transition을 수행하고 싶은 경우 아래와 같은 실행코드를 command의 실행내용에 첨부하자.

수순

전체에서 공유할 1개의 subsystem과 그 기본 element를 각각 작성후, element에 대해서 공유할 커맨드를 추가하고, 각 subsystem에서 이 element름 참조하여 inheritance base로서 상속하여 Execute{COMMAND}를 각 view에서 호출 가능하게 한것을 전제로 한다.
그냥 다른 subsystem에서 view를 구성하여, 연결하지 않은 상태의 scene에서 공통적인 view를 호출하면 그만인 문제였다. 단, 각 Command는 사용하기 위해서 Registered Instance에 등록 될 필요가 있다. 상속하게 되는경우 base만큼의 메모리가 중첩 사용되어서 메모리 사용에 있어서 좋지 않다.

다이어그램에서 이 COMMAND는 따로 transition설정치 않고, COMMAND의 실행 구문에 아래의 코드를 추가하여 별다른 설정없이 특정 scene으로 transition하게끔 설정한다.

{SceneManager} = 작성한 scene manager의 이름
{LevelName} = scene file name
            GameManager.TransitionLevel<{SceneManager}> (  
                (container) =>   
                     {   
                          container._{SceneManager}Settings = new {SceneManager}Settings ();   
                          // something do on finished.  
                          Debug.Log("transition done");  
                     },  
                     new string[]{"{LevelName}"}  
           );  
상기의 기본 코드를 기반으로 작성한 generic function
 
 using System;

 /// <summary>  
 /// Transition uFrame Scene.  
 ///   
 /// Recommend place this function on singleton class or statically
 ///   
 /// Synopsys  
 /// TransitionScene<TitleScene> ("TitleScene");  
 ///   
 /// Compitable with uFrame 1.5.1 rc2  
 /// @author Donghyun You  
 /// @since 2015. 1. 18.  
 /// </summary>  
 /// <param name="sceneName">Scene name that registered on builtin levels</param>  
 /// <param name="onFinished">On finished.</param>  
 /// <typeparam name="T">The 1st type parameter.</typeparam>  
 public void TransitionScene<T>(string sceneName,Action onFinished=null) where T : SceneManager {  
      if (string.IsNullOrEmpty (sceneName))   
      {  
           throw new ArgumentNullException("sceneName");  
      }  
      Type type      = typeof(T);  
      onFinished      = onFinished ?? delegate() {};  
      GameManager.TransitionLevel<T> (  
           (container) =>   
           {   
                var settingParam = container.GetType ().GetField("_"+type.Name+"Settings");  
                var settingInstance = Activator.CreateInstance(Type.GetType (type.Name+"Settings"));  
                settingParam.SetValue(container,settingInstance);  
                // something do on finished.  
                onFinished();  
           },  
           new string[]{sceneName}  
      );  
 }  

댓글 없음:

댓글 쓰기