tanaka's Programming Memo

プログラミングについてのメモ。

Unity3.X+Androidで日本語描画

Windows上ではUTF16にすればすぐに描画できるが、Unity3.XのAndroidはダイナミックフォントに対応していないので、フォントの生成もする必要がある(Unity4では対応するらしい)。

Xperia Tablet Sで日本語の描画ができない(2012/11/28追記)

SH-12C、HTC EVO 3Dでは動作していた日本語描画が、Xperia Tablet Sで失敗。原因は、フォントのテクスチャサイズが2048x2048以下じゃないと描画できないことだった。(SH-12CとHTC EVO 3Dは4096x4096まで対応)

対応方法は、2048x2048で収まるフォントに差し替えるか、FontのインスペクタのFont Sizeを、テクスチャが2048x2048になるまで小さくすること。M+FONTSの場合、10が上限。

日本語を自由に使うには、やはりUnity4にした方がいいみたい。

フォントの準備

完全フリーのフォント「M+FONTS」を使ってみる。

  1. M+FONTSのサイトのDOWNLOADから「M+ TESTFLIGHT」をダウンロードする。
  2. 7zipなど、xzフォーマットに対応している解凍ソフトを入手。
  3. 7zipだと、デスクトップに置くと解凍しづらいので、c:\tempなどに移動してから解凍。
  4. tarファイルが出来上がるので、もう一度解凍すると、フォントの入っているフォルダが作成される。

Unityに組み込み

  1. 入手したフォントフォルダを開いて、好きなトゥルータイプフォント(.ttf)を、Unityのプロジェクトビューにドラッグ&ドロップして追加する。
  2. インスペクタで以下のように設定。
    • FontSize:20(SH-12Cだと、これより大きいサイズでは正常に描画されなかった)
    • Font Color:白のままでよい。MaterialやGUI Skinで、使用時に変更可能。
    • Character:Androidで日本語を使う場合はUnicodeを選択。
    • Font Rendering:そのままでよい。出来上がりを見て調整すればよい。
    • 2.x Font Placing:チェックは入れない。
      • Unity3.Xでは文字の縦方向の位置にAscent情報を利用するようになった。Unity2.Xの状態に戻したい場合にチェックを入れる(らしい)。
    • 設定が完了したら「Apply」ボタンを押して更新する。

以上で、フォントとして使用できるマテリアルとテクスチャが、読み込んだフォントの子供として出来上がる。

OnGUI()内で利用

  1. スクリプトを作成。
  2. スクリプトをメモ帳などで開き、「Unicode(big endian)」(UTF-16 big endian)に文字コードを変更して保存する。
  3. スクリプトをエディタで開き、パブリック変数でGUIStyleを定義。
public GUIStyle myGUIStyle;
  1. スクリプトを適当なゲームオブジェクトに割り当てて、そのオブジェクトのインスペクタを表示。
  2. myGUIStyleのFont欄に、読み込んだフォントをドラッグ&ドロップする(FontSize,FontStyleは変更できないのでそのままにしておく)。
  3. スクリプトのOnGUI()内で、myGUIStyleを指定して文字を描画する。
void OnGUI() {
    GUI.Box(new Rect(0,0,100,100),"ABC\nあいうえお\n諸行無常",myGUIStyle);
}
  1. 文字の色変更は以下のように、GUIStyleのnormal.textColorを変更する。
void OnGUI() {
    myGUIStyle.normal.textColor = new Color(255,200,200);
    GUI.Box(new Rect(0,0,100,100),"ABC\nあいうえお\n諸行無常",myGUIStyle);
}

注意点

  • PCではぼやけて見えても、AndroidでBuild&Runすると綺麗に描画される。
  • FontSizeやFontStyleの変更は出来ない。文字サイズを調整したい場合は、GUI.matrixにスケーリングを設定した行列を設定するか、3DTextを利用する。

GUIText / 3DTextの利用

OnGUI()を使わずに文字を描画したり、文字サイズを変更したりするために、GUITextや3DTextを利用する場合も、上記で読み込んだフォントが利用できる。

  1. GUI Textを使う場合は、「GameObject」→「Create Other」→「GUI Text」。3D Textを使う場合は、「GameObject」→「Create Other」→「3D Text」で、ゲームオブジェクトをシーンに追加する。
  2. オブジェクトを選択して、インスペクタの「GUIText」や「Text Mesh」の項目の「Font」欄に、読み込んだフォントをドラッグ&ドロップする。
  3. インスペクタの「Mesh Renderer」欄の「Materials」から「Font Material」を選択して、もう一度同じ「Font Material」を選択し直す。
  4. 3D Textでは、「Character Size」を変更することで文字サイズを変えられる。

以上で日本語対応完了。こちらも「Font Size」と「Font Style」は変更できないので注意。

GUIText / 3DTextの文字色の変更

新しくマテリアルを作成して、そのマテリアルを設定する。

  1. プロジェクトに新しいMaterialを追加する。
  2. MaterialのShaderを「GUI/Text Shader」にする。
  3. 作成したMaterialのテクスチャに、フォントの下に作成されている「Font Texture」をドラッグ&ドロップして割り当てる。

以上で作成したマテリアルをGUI Textや3D TextのMesh Rendererに設定し直して、割り当てたMaterialのcolorを変更する。

参考URL