scaleform.minarto.com

trace를 게임상에서 보려면... 본문

Utils & Liblary

trace를 게임상에서 보려면...

미나토 2012. 9. 19. 18:50


0. 한번은 쉬어갑니다



개인적으로 친분이 있는 방문자 분들 중 몇분은 아시겠지만 집에 우환이 좀 있습니다.



그래서 이번 한번은 UI 만들기가 아닌 예전에 써놓은 포스팅으로 대체합니다.


UI 만들기도 안써놓은 것은 아닌데 마무리가 좀 부족하다고 판단했습니다.



참고로 이번 포스팅부터 코드하이라이트를 적용했습니다. 테스팅겸 겸사겸사 만든 포스팅이랍니다

http://alexgorbatchev.com/

누군가 오류난다는 제보가 들어오지 않는 이상 이대로 주욱 가보려고요...

(코드 하이라이트를 적용한 http://www.minarto.com/370 이 글이 먼저 포스팅 되기는 했지만 작성은 이 포스팅을 먼저 했었거든요)




뭐 각설하고...



네, trace 로 UI의 로그를 찍어보는 일은.... 뭐, 당연히 그냥은 안됩니다.



LocalConnection 이라던가 통신 api 가 제한된 스케일폼으로서는 외부 디버거를 쓰기도 힘들죠...



그래도 언리얼을 사용하는 입장에서는 방법이 있긴 합니다.


http://udn.epicgames.com/Three/ScaleformTechnicalGuideKR.html#로그 켜기


이 링크에서 시키는 대로 해보시면 언리얼 상에서 trace를 확인하실 수 있을 겁니다.

다른 엔진 상에서는 다른 엔진 대로의 방법이 있겠죠?



하지만 이 방법이 마냥 편하지 만은 않다는게 문제입니다.... 로그 창에는 UI에 관한 것만이 아니라 개발중의 모든 로그가 뜨거든요


그래서 전 아예 디버그용 위젯 하나를 만들기를 권합니다.



이 글을 이해하시려면...


1. as3 를 아셔야 합니다...

2. 옵저버 패턴을 수박 겉핥기 정도만 아셔야 합니다



위젯을 만들기 전에 일단 두가지 클래스를 먼저 만들겠습니다.





1. CustomEvent



as2 시절의 CLIK 컴포넌트는 이벤트를 오브젝트로 만들어서 날리기 때문에 인자를 마음대로 넣어서 던질 수 있습니다만...as3 는 Event를 상속받아야만 합니다.


별도의 인자를 던질 수 없는 Event 클래스를 보완하기 위해 플래시 개발자들은 보통 CustomEvent 를 만들어 씁니다.


CustomEvent 는 다음과 같이 만듭니다


package events {
	import flash.events.Event;

	/**
	 * @author KIMMINHWAN
	 */
	public class CustomEvent extends Event {
		public var param:*;
		
		public function CustomEvent($type : String= $param:*=null, $bubbles : Boolean = false, $cancelable : Boolean = false) {
			super($type, $bubbles, $cancelable);
			
			param = $param;
		}
		
		
		override public function clone() : Event {
			return new CustomEvent(type, param, bubbles, cancelable);
		}
	}
}

param 부분에 넣고 싶은 인자를 넣으면 되겠죠?







2. TraceManager



TraceManager 는 각 trace 들을 받을 옵저버입니다. 여기서 위에서 만든 CustomEvent 를 사용해야겠죠?

package {
	import CustomEvent;
	
	import flash.events.EventDispatcher;
	
	public class TraceManager extends EventDispatcher {
		// 하나의 객체만 생성하기 위해 싱글턴으로 구현했습니다
		private static var _instance:TraceManager = new TraceManager;
		public static function get instance():TraceManager{
			return	_instance;
		}
		
		// 실제 호스트 코드에는 이 메소드만 사용하게 됩니다. 로그가 들어왔음을 서브젝트(Subject) 에서 알기 위해 이벤트를 발생시킵니다
		public static function trace(...$args):void{
			_instance.dispatchEvent(new CustomEvent("log", "" + $args));
		}
		
		public function TraceManager() {
			if(_instance){
				throw new Error("don't create instance");
			}
		}
	}
}



뭐, 이벤트 타입명은 마음대로 지으셔도 무방합니다.




3. TraceWidget 



자, 마지막 위젯입니다. 이 위젯을 사용할 때만 게임에서 로드해서 사용하면 되겠죠...


위젯의 모양이야 뭐 알아서 만드셔야겠죠??

import scaleform.clik.core.UIComponent;
	
import  TraceManager;
	
import flash.events.Event;
import flash.text.TextField;
	
/**
 * @author KIMMINHWAN
 */
public class TraceWidget extends UIComponent{
	public var textField:TextField;
		
	override protected function configUI():void {
		super.configUI();
TraceManager.instance.addEventListener("log", _onLog);
}
		
private function  _onLog  ($e:Event):void {
	if (textField) {
		textField.appendText("\n\n" + new Date + "\n" + $e["param"]);
}
	}
}



fla 파일에는 textField 라고 이름붙인 텍스트 필드 하나 정도만 붙여넣으면 되겠죠? 필요하다면 스크롤바를 붙이시면 더 편하게 사용할 수 있게 됩니다.



TraceManager객체에 이벤트리스너를 달아뒀으니 당연히 이젠 log 이벤트가 발생할 때마다 텍스트 필드에 발생 시간과 내용이 찍히게 될겁니다.




사용은 다음과 같이 하면 되겠죠?

import TraceManager;

TraceManager.trace("로그 좀 찍어보자", 12312331, "우하하하하하");


아무 코드에서나 이렇게 사용하시면 됩니다.





이렇게 해놓고 위젯을 불러들이면 당연히 로그가 보일거고, 안불러도 그냥 잘 작동합니다.





4. ...



여기까지의 코드는 제가 회사에서 사용하는 코드와 크게 다르지 않습니다.



제가 여기에 추가해서 쓰는 기능은 딱 두가지입니다.


1. 런타임 에러도 출력...

2. 로그가 아닌 에러가 발생하면 클라이언트 쪽으로 날려, 클라가 디버깅에 활용하도록 함


이정도입니다...


코드를 다 써놨으니 딱히 설명할 것도 없네요...