사실 다이어그램을 사용해서 플로우를 정리하는 것을 전제로하는 프레임워크에서 이런 설정은 사용에 따라 독이 될수도 있지만, 어떤 구조에서는 이 일일히 연결하는 작업이 오히려 구성에 있어서 중첩구현, 구조의 복잡화 등을 야기할 수 있다고 생각이 된다.
따라서 diagram에서 scene transition 설정을 일일히 설정하지 않고 암묵적으로 고정값으로 transition을 수행하고 싶은 경우 아래와 같은 실행코드를 command의 실행내용에 첨부하자.
수순
그냥 다른 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}
);
}
댓글 없음:
댓글 쓰기