unity3d 의 다이나믹 텍스트 렌더링 방법

유니티를 해보면서 느낀점이라면 여러가지 이겠지만 , 역시 여타 다른 게임 엔진들과 같은 불편 사항을 가지고 있다.

그것은 바로 텍스트 렌더링 이다. Adobe flash 나 Microsoft WPF , Silverlight 등 과 같은 플랫폼들은 쉽게 텍스트를 렌더링 하고 그것을 변형 과 업데이트가 가능지만 , 유니티를 비롯한 여러 엔진들은 편리한 텍스트 렌더링을 지원하지 않는다. 그래서 대부분 비트맵 폰트의 형태를 만들어서 사용을 하지만 폰트의 크기나 문자수에 따라 부하가 걸리기 마련이다. xna 시절에 WPF 나 윈폼의 텍스트박스 컴포넌트를 비트맵으로 가져와 랜더링 하는 아이디어를 착안하여 유니티의 GUIText 를 통하여 문자열을 실시간으로 불러 와 보겠다.




1) 먼저 GUIText 하나를 만들어 본다.




2) GUIText 가 무사히 나오고 있다.





3) 별도의 텍스쳐를 렌더링할 카메라를 생성한다. 


* 추가로 오디오 리스너를 꺼주어야한다





4) 기존 메인 카메라와 햇갈리지 않도록 이름을 지정 하고 

뎁스를 기존 메인 카메라보다 뒤로 미루어 렌더링우선순위를 뒤로 미룬다.





5) 텍스트가 찍힌 텍스쳐를 입혀볼 큐브를 만든다. 



6) 간단히 빛을 추가하자




7) 다시 GUIText 로 돌아와서 레이어를 이동시키자.


* 추가로 TextLayer 를 만든다.



8) 텍스트를 랜더링할 카메라를 선택하여 컬링마스크의 레이어를 TextLayer 만 선택되도록 한다.




9) 메인 카메라의 컬링 마크스 는 TextLayer 가 랜더링 되지 않도록 한다.



10) GUIText도 텍스트레이어로 이동 시킨다.




11) 그러면 일단 화면에서 텍스트는 사라졌다.



12) 이제 렌더 텍스쳐 하나를 만들자 , 렌더타겟과 비슷한 개념이다. 


* 이름을 간단히 지정했다.



13) 텍스쳐 카메라 의 TextureTarget 을 방금 만든 렌더텍스쳐로 지정한다.




결과 , 큐브에 추가 된다.




14) 이제 배경을 지울 차례이다. 내장 쉐이더의 Bumped Diffuse 를 선택한다.



* 배경이 사라졌다.



좀더 명확히 해보았다.




이제 이 렌더된 텍스트를 실제로 사용하기위해 바이트배열로 저장해보겠다.

여타 다른 엔진들의 렌더타겟 사용법과 비슷하다. 렌더텍스쳐를 액티브 시키고 , 그 영역만큼 텍스쳐로 픽셀을 넣는다.

또한 주의할점은 TextCamera를 업데이트 시키고 그다음 이루어져야 한다. 안그러면 한프레임 전의 화면이 출력된다.


큐브에 사용한 스크립트는 아래와 같다

using UnityEngine;
using System.Collections;
using System.IO;
public class TexControl : MonoBehaviour {

	public GUIText text ;
	public Camera textCamera;
	void Start () {
		
	}
	
	
	int c = 0 ;
	public void capture()
	{
		text.text = (++c) + "STR";
		
		textCamera.Render();
		RenderTexture rt = gameObject.renderer.material.mainTexture as RenderTexture;
		Texture2D capturedText = GetRenderTexturePixels(rt);
		
		byte[]data = capturedText.EncodeToPNG();
		FileStream fs = new FileStream("/Users/superSc1/Desktop/test.png" , FileMode.OpenOrCreate );
		fs.Write(data , 0 , data.Length);
		fs.Close();
		
		Texture2D.DestroyImmediate(capturedText , true); // destory texture2d
		
		
		print("Capture");
	}
	
	
	public Texture2D GetRenderTexturePixels(RenderTexture tex)
	{
		RenderTexture.active = tex;
		
		Texture2D tempTex = new Texture2D(tex.width , tex.height );
		tempTex.ReadPixels( new Rect(0,0,tex.width , tex.height) , 0 , 0);
		tempTex.Apply();
		
		return tempTex;
	}
	
	void Update () {
		if(Input.GetKeyDown(KeyCode.C))
		{
			capture();
		}
	}
}



Yamecoder 야매코더_
unity3d 2013.04.20 23:55
Powerd by Tistory, designed by criuce
rss