Unityをモバイル用途で使用する場合、
DynamicCharacterを使用することができません(3.5現在)。
そこで、使用する文字を全てテクスチャにしてから使用するのですが、
たとえばiPhoneで使用できる最大テクスチャサイズ1024×1024に
全ての文字を入れようとすると、文字が小さくなってしまいます。

 

そこで、1つのフォントに複数のテクスチャを使用する方法を考えてみました。
以下では2枚のテクスチャを使用することを想定しています。

 

用意するもの
・少なくとも、漢字など大半の文字が等幅であるFont
・使用する文字一覧(決まっていない場合は、必要になりそうな全ての文字)

 

まず、使用する文字一覧を等幅の部分とそれ以外の部分に分け、
「それ以外」の部分をざっくり2等分しておきます。

 

A. 等幅でない部分(Propotional)
B. それ以外1(fixed-pich)
C. それ以外2(fixed-pich)

 

次に、
A+B, A+C をそれぞれ text fileにしてAssetに入れます


 

次に、.TTFフォントを用意し、これをcopyして名前を変えたものを作ります。
たとえば
ipaexg.ttf -> ipaexg0.ttf, ipaexg1.ttf

2つの.TTFを用意したら、これをUnityのProjectにDrag&Dropします。
それぞれのFontのCharacterをCustomSetにし、
先ほど用意したテキストの内容をコピペします。


 

そして最後に、出力したい文字列を
それぞれのテクスチャにある文字を使って2度描きします。

 


using UnityEngine;
using System.Collections;

public class SingleFontMultiTexOut : MonoBehaviour {
 public string outString;
 public TextAsset charList0;
 public TextAsset charList1;
 public TextMesh txtMesh0;
 public TextMesh txtMesh1;
 // Use this for initialization
 // FontのCustomCharsにあらかじめcharList0/1と同じものをコピペして入れてください
 void Start () {
  string outStr0 = "";
  string outStr1 = "";
  for(int ii = 0; ii < outString.Length; ++ii){
   // 一覧になければ全角空白に変換 
   outStr0 += (charList0.text.IndexOf(outString[ii])<0) ? " " : outString.Substring(ii,1);
   outStr1 += (charList1.text.IndexOf(outString[ii])<0) ? " " : outString.Substring(ii,1);
  }
		
  txtMesh0.text = outStr0;
  txtMesh1.text = outStr1;
 }
	
 // Update is called once per frame
 void Update () {
 }
}

 

上記では、テクスチャにない文字を全角空白にしていますが、
全角空白が等幅漢字扱いでなかった場合(propotional)は、
べつの等幅文字に置き換え、その文字のある部分のテクスチャを
透明にしてください。


上の2つがそれぞれのフォントで表示したもの、
3番目がそのまま重ねて2度描きしたもの、
一番下が、スクリプトで文字列を置き換えてから2度描きしたものです。
どちらのフォントにもない文字は全角スペースとして表示されます。

 

等幅フォントを使用すれば、2枚目以降のテクスチャの共有部分は
全角スペースと半角スペースだけ用意すればよいので
さらに簡単になります。

 

5月 2, 2012 at 1:03 pm by emesiw
Category: Unity