유니티 게임의 한글화와 패치 제작 – 폰트 엔진(플러그인) 소개(미완성)

유니티 게임에서 화면에 나오는 모든 오브젝트는 GameObject로 존재한다. 화면에 표시되는 글자도 마찬가지로 하나의 GameObject로 이루어져있고 GameObject의 컴포넌트인 MonoBehaviour에 글자를 어떻게 출력할지 기술되어있다. 그리고 Text GameObject에서 사용되는 폰트는 별도의 GameObject(또는 MonoBehaviour 단독)로 만들어져있다. 그 외에 Sprite를 Text와 혼용해서 사용하는데 보조를 해주는 것 같이 글자 출력과 관련된 작업을 도와주거나 맡아서 하는 것을 폰트 엔진이라 부른다.

글자가 출력될 때 어떠한 과정을 거치는지, 유니티 엔진에서 통상적으로 사용하는 폰트 엔진은 무엇이 있는지, 해당 폰트 엔진을 사용한 게임을 빌드하면 어떤 결과가 나오는지를 알아보고자 한다.

유니티 게임 우리말화 도구 베타 버전을 공개하였습니다. 이에 관한 설명은 GitHub의 wiki에서 서술합니다. https://github.com/dmc31a42/UnityL10nTool/wiki

유니티 게임의 한글화와 패치 제작 – 서론 으로 돌아가기

본 강좌는 70~80% 완성되면 바로 공개되며, 잘못된 부분이 있으면 그때 그때 수정하는 것으로 하겠습니다. 아래의 강좌 내용은 언제든지 수정될 수 있습니다. 질문은 댓글로 달아주시거나 GitHub(https://github.com/dmc31a42/UnityGameL10nTools/)의 issue를 활용하여주시면 감사하겠습니다.

 

폰트 렌더링

정확한 렌더링 과정을 공부하지 않았지만, 화면에 글자가 출력될때는 출력할 문장에 있는 글자 각각에 대해 대응되는 항목를 미리 지정된 폰트 안에서 찾고, 폰트의 포멧에 따라 폰트 내의 이미지를 가져다 확대해 쓰거나, 벡터 방식으로 저장된 정보를 가지고 출력하고자 하는 해상도에 맞춰 이미지를 생성하여 출력되어야하는 자리에 글자 하나하나의 폭과 높이에 따라 차곡차곡 쌓여서 화면상에서 볼 수 있는 하나의 문장이 된다. 만약 지정된 폰트에 대응되는 항목이 없다면 fallback 목록에 지정된 대체 폰트를 찾는다. fallback 목록에서도 못찾으면 해당하는 글자는 □ 로 표시하거나 높이와 폭이 0인 글자로 간주하고 출력 자체를 하지 않는다. ‘언어 파일’에서 게임이 한글 출력을 지원하지 않을 때 의도하지 않는 모습으로 출력된 것은 이 때문이다.

아래의 설명에서 두개의 별개인 대상을 폰트 엔진이라 지칭하고 있다. 하나는 폰트(폰트의 종류와 파일, 이를 저장하기 위한 포멧을 모두 포함)+폰트를 출력하기 위한 스크립트(MonoScript)+사용할 폰트를 특정하는 정보, 출력할 문자열, 폰트 

아래에서 사용될 용어는 다음과 같다.

  • 폰트
    : 폰트 파일 그 자체 및 폰트를 저장하기 위한 포멧을 모두 포함하는 개념. 유니티에서 기본적으로 지원하는 폰트는 다이나믹 방식, bitmap 방식을 모두 지원하고, 두 저장 방식 모두 유니티 에디터에서 개체로 표현될때는 똑같이 표현되고, 빌드시 출력되는 결과물이 다르게 나타난다. 그리고, 서드파티 플러그인의 경우 폰트 파일 또한 MonoBehaviour의 인스턴스로 구현되어 있는 경우도 있다. 따라서 유니티에서 Font로 인식되는 것 뿐만 아니라 glyph(글자 하나하나의 정보)가 모여있는 모든 Object를 폰트라 부르겠다.
  • 텍스트(폰트) 컴포넌트
    : 유니티 엔진에서 화면상에 표현되는 모든 것은 각각 부모로 GameObject를 가지고 있다. GameObject 내에 어떠한 컴포넌트를 가지고 있느냐에 따라 지형이 되기도 하고, 캐릭터가 되기도 하고, UI가 되기도 한다. 이 중 텍스트(폰트) 출력을 담당하는 컴포넌트를 특정하여 텍스트(폰트) 컴포넌트라 부르겠다. 텍스트 컴포넌트에는 대표적으로 출력할 문자열, 해당 문자열에 적용할 폰트를 지정(폰트 자체를 담고있지는 않음), 출력된 문장의 크기(폰트 크기), 정렬, 문단 형식, 색상, 질감 등 많은 정보를 담고 있다.
  • 폰트 스크립트
    —-
  • 폰트 엔진
    : 위에서 언급한 모든 것과 이를 유기적으로 관리해주기 위한 별도의 스크립트 모두를 포함한 것을 말한다. 폰트를 생성하기 위한 GUI, 텍스트 컴포넌트를 생성하기 위하여 에디터에 Injection해주는 스크립트, 문자열 외에 sprite를 사용할 수 있게 해주는 스크립트, 폰트와 텍스트 컴포넌트의 Inspector 창에 유용한 정보를 제공, 수정하는데 도움을 주는 GUI 등 문자열을 출력해주기 위해 필요한 모든 작업을 지원해주는 에셋, 플러그인 등을 총체적으로 폰트 엔진이라 부른다.

폰트

폰트는 글자의 형상을 어떻게 저장하느냐에 따라 다이나믹 폰트와 비트맵 폰트로 나뉜다.

다이나믹 폰트

  • 글자의 형상을 벡터 방식으로 저장한 glyph를 가지고 폰트를 사용할 때 출력할 해상도에 맞추어 이미지를 렌더링하고 렌더링한 이미지를 출력할 곳에 표시한다.
  • 글자를 출력할 때마다 출력할 환경에 맞추어 글자를 항상 렌더링하기 때문에(캐시를 사용하면 한번만 렌더링하고 재사용할 수는 있다) 작동 환경에 따라 CPU에 부담을 줄 수 있고, 고성능 CPU일 지 라도 렌더링하는 순간 딜레이가 생길 수 있다.
  • 보통 ttf, otf 등과 같은 단일 파일 형식으로 저장된다.

비트맵 폰트

  • 글자의 형상을 모아 이미지 하나에 저장하고 글자와 이미지와의 관계가 담긴 glyph를 가지고 필요한 글자를 이미지에서 복사하여 글자가 출력되어야하는 곳에 글자를 표시한다. glyph에는 글자 각각에 대해 큰 이미지에서의 위치와 글자가 실제로 표시되었을 때의 크기 관계에 대한 정보가 담겨있다.
  • 이미 렌더링 된 폰트 정보를 사용하기 때문에 즉시 응답성을 보장하지만, 이미지로 저장된 폰트의 크기는 보통 작기때문에 큰 글자의 출력에는 적합하지 않을 수 있다.
  • 보통 glyph 정보가 담긴 파일(텍스트, 바이너리 등)과 glyph 정보에 해당하는 단일 이미지 파일, 두 개의 파일로 구성되어 있다.

유니티 기본 폰트 엔진

유니티에는 텍스트를 출력할 수 있는 기본 텍스트 컴포넌트를 2개 가지고 있다. 하나는 UnityEngine.Object을 상속받은 TextMesh이고, 나머지는 MonoBehaviour로 구현된 UnityEngine.UI.Text이다. 이 두 폰트 컴포넌트는 유니티 엔진에 내장되어 있고, 폰트는 유니티에서 제공하는 폰트 UnityEngine.Object 클래스를 사용한다.

TextMesh와 UnityEngine.UI.Text에 사용되는 폰트 엔진은 유니티 엔진에 기본으로 포함되어있다.

폰트

유니티 엔진에서 사용되는 폰트 에셋은 ‘다이나믹’ 방식과 ‘비트맵’ 방식 둘 다 지원 한다. 빌드될 때 두 방식 모두 Font, Material, Texture 2D 에셋은 (비어있을 지라도) 만들어진다.

다이나믹

폰트를 Import하고 Inspector의 Import Settings에서 Character 설정을 ‘Dynamic’으로 하면 된다.
Font 에셋에서 m_ ConvertCase는 -2이고 glyph 역할을 하는 m_CharacterRects Array의 원소는 없다. 그리고, 원본 폰트 파일의 binary가 m_FontData char(byte) Array에 그대로 들어가있다.

비트맵

폰트를 Import하고 Inspector의 Import Settings에서 Character 설정을 ‘Unicode'(ASCII default set, ASCII upper case, ASCII lower case, Custom set)으로 하면 된다.

Font 에셋에서 m_ConvertCase는 -1이고 glyph 역할을 하는 m_CharacterRects Array는 CharacterInfo 클래스를 원소로 담고있고 Character 설정에 기재된 문자들에 대응되는 glyph가 m_CharacterRects 원소로 만들어져있다.

텍스트 컴포넌트

TextMesh

TextMesh의 텍스트 컴포넌트는 TextMesh라는 고유의 Type이 있다. 본 타입에는 m_Text  필드에 출력할 문자열을 담고 있고, 폰트를 출력할 특성이 m_OffsetZ, m_CharacterSize, m_LineSpacing, m_Anchor, m_Alignment, m_TabSize, m_FontSize, m_FontStyle, m_RichText 등의 필드에 담겨있다. 폰트는 PPtr<Font> m_Font 필드에 지정되어있다.

UnityEngine.UI.Text

UnityEngine.UI.Text의 텍스트 컴포넌트는 (사실 항목이름이 이것인 이유이지만) MonoBehaviour로 저장되어있고 본 MonoBehaviour의 클래스명은 UnityEngine.UI.Text이다.(해당하는 MonoBehaviour의 m_Script 필드를 열어보면 확인할 수 있다.) 이 컴포넌트에서는 글자의 질감(색상, 무늬 표현, 그림자와 같은)을 설정하는 PPtr<$Material> m_Material 필드, (ColorRGBA m_Color는 뭐하는 필드인지 모르겠다), 폰트를 지정하기 위한 UnityEngine.UI.FontData m_FontData 필드, 출력되는 글자가 저장된 m_Text 필드가 있다. UnityEngine.UI.FontData필드에는 Font 에셋을 지정하기 위한 PPtr<$Font> m_Font 필드와 폰트의 속성을 지정하는 m_FontSize, m_FontStyle, m_BestFil, m_MinSize, m_MaxSize, m_Alignment, m_AlignByGeometry, m_RichText, m_HorizontalOverflow, m_VerticalOverflow, m_LineSpacing 필드 등이 있다.

 

TextMesh Pro 엔진

 

 

 

Advertisements

유니티 게임의 한글화와 패치 제작 – 폰트 엔진(플러그인) 소개(미완성)”의 2개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중