블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2804)
Unity3D (860)
Script (91)
Extensions (16)
Effect (3)
NGUI (81)
UGUI (9)
Physics (2)
Shader (37)
Math (1)
Design Pattern (2)
Xml (1)
Tips (201)
Link (23)
World (1)
AssetBundle (25)
Mecanim (2)
Plugins (80)
Trouble Shooting (70)
Encrypt (7)
LightMap (4)
Shadow (4)
Editor (12)
Crash Report (3)
Utility (9)
UnityVS (2)
Facebook SDK (2)
iTween (3)
Font (13)
Ad (14)
Photon (2)
IAP (1)
Google (11)
URP (2)
Android (51)
iOS (45)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

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

그것은 바로 텍스트 렌더링 이다. 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();
		}
	}
}




출처 : http://yamecoder.tistory.com/235

반응형
Posted by blueasa
, |


'3D Text'를 사용하려고 화면에 올려 놨더니....

 

 

위 스크릿 샷을 보면 같은위치에 있는 3d text를 다른 방향에서 보았을때 항상 다른 오브젝트를 무시하고 화면에 텍스트가 출력되는걸 볼 수 있습니다.

이것만 봐서는 '3D Text'의 기본 동작이 게임 오브젝트(Game Object)가 아니라 'UI'인것 같습니다.

 

우리가 원하는건 '3d text'가 다른 오브젝트들 처럼 다른 오브젝트 뒤로 가면 뒤로 간 부분은 보이지 않았으면 하는 것인데 말이죠.

 

이렇게 말이죠.

 

 

1. 해결방법

검색을 해보니 '3D Text'의 기본 쉐이더는 'GUIText'라고 합니다.

어쩐지 -_-;;

 

결국 새로운 쉐어더를 만들어야 하나 봅니다.

 

다행히 이것을 설명한 자료를 찾았습니다.

참고 : 유니티3D 위키 - 3DText

 

여기의 설명에 따르면 쉐이더를 만들고 폰트 텍스쳐를 지정하면 된다고 합니다.

 

 

1-1. 쉐이더(Shader) 만들기

Project > Create > Shader

을 선택하여 새로운 쉐이더를 만듭니다.

 

전 'My3DText'로 만들었습니다.

 

쉐이더코드는 다음과 같이 넣습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Shader "Custom/My3DText"
{
    Properties {
       _MainTex ("Font Texture", 2D) = "white" {}
       _Color ("Text Color", Color) = (1,1,1,1)
    }
 
    SubShader {
       Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
       Lighting Off Cull Off ZWrite Off Fog { Mode Off }
       Blend SrcAlpha OneMinusSrcAlpha
       Pass {
          Color [_Color]
          SetTexture [_MainTex] {
             combine primary, texture * primary
          }
       }
    }
     
}

 

 

 

 

 

 

1-2. 메트리얼(Material) 만들기

Project > Create > Material

을 선택하여 새로운 텍스쳐를 만듭니다.

여기서도 'My3DText'로 이름을 만들었습니다 ㅎㅎㅎ

 

 

(1) 쉐이더를 'My3DText'로 선택 합니다.

 

 

 

(2) 폰트를 추가 합니다.

프로젝트에 폰트를 추가 합니다.

전 나눔폰트를 추가 했습니다.

 

 

폰트를 추가한후 폰트 텍스쳐(Font Texture)가 생성되었는지 확인 합니다.

만약 생성이 되지 않았다면 다른 폰트 파일을 써야 할듯 하네요.

 

추가한 폰트는 '3D Text'에 지정해주셔야 합니다.

여기서 주의 해야 할것이 폰트를 먼저 바꿔주지 않으면 메트리얼이 적용되지 않는 경우가 있습니다.

(버그인듯 하네요)

먼저 폰트를 적용한후 매트리얼을 적용해 주세요.

 

 

(3) 텍스쳐 지정하기

 

아까만든 메트리얼에 폰트 텍스쳐를 지정합니다.

 

드래그를 해서 넣어도 됩니다.

 

 

1-3. 메트리얼 적용

이제 '1-2.'에서 만든 메트리얼을 '3D Text'에 적용 합니다.

 

 

 

2. 테스트

이제 매트리얼을 '3D Text'에 적용하고 테스트를 해봅시다.

마우스로 클릭한 상태로 카메라를 움직여 보세요.

(오른쪽 클릭도 가능합니다.)

마무리

그런데 이게 문제가 폰트칼라가 먹질 않습니다 ㅡ.-;;

매트리얼에 폰트칼라를 줬다가는 모두다 같은 색이 되죠 ㅎㅎㅎㅎ

이건 좀 생각 해봐야 할것 같네요.



출처 : http://blog.danggun.net/2256

반응형
Posted by blueasa
, |

Font fallBack

Unity3D/Font / 2016. 1. 5. 09:37

1.     Unity Font fallBack 기능
현재 폰트에 표현하지 못하는 글자가 있을 때다른 폰트를 참조할 수 있도록 검색할 폰트리스트를 적어둔다.
http://forum.unity3d.com/threads/text-characters-not-visible-in-the-built-game-app.225594/

2.     예를 들어 현재 폰트가 Thai Bold폰트일 때 Thai어는 bold효과가 있지만다른 기본글자(영문자)는 효과가 없이 나온다.

따라서, fallBack기능과 더불어 사용할 때에는 우선순위를 잘 정해야 모두 Bold효과가 나올 수 있다.

3.     Unity freeType 라이브러리를 사용한다.
http://www.soen.kr/lecture/library/freetype/ft1.htm
폰트 타입에 상관없이 모든 폰트를 다루며글자마다 폰트에 있는 글자인지 판단하기 때문에
여러 글자가 섞여 있어도 fallBack List의 폰트를 가져오게 된다.

4.     지금까지의 테스트로는 Noto Sans CJK를 기본으로 Noto Sans Thai fallBack List에 추가를 하여 사용하는 것이 
가장 좋은 것 같다.

 

Noto Sans : 영문자스페인어 지원 / 한글중국어는 기본 텍스트 또는 안나올지도

Noto Sans CJK : 중국일본한국어영문자스페인어 타이어 안나옴

Noto Sans Thai : 타이어 / 한글영문자 기본 텍스트 또는 안나올지도







Noto Sans CJK와 Noto Sans Thai를 assetBundle로 구성하여 패치로 다운 받게 했더니 fallBack 기능이 안되었다.

용량이 작은 Noto Sans Thai를 apk에 포함 시킨 채 , Noto Sans CJK만 assetBundle로 구성하였더니 되는 듯..


단, Noto Sans CJK를 assetBundle로 load할 때 fontNames를 설정 해야 한다.




출처 : http://jenemia.tistory.com/315

반응형
Posted by blueasa
, |