強火で進め

このブログではプログラム関連の記事を中心に書いてます。

モバイル環境でダイナミックフォントが使える様になるプラグイン「unity-sysfont」


(2012/06/28 追記)
※こちらのプラグインの対応環境は Mac/iOS/Android となっています(Windowsなどは非対応)。
(追記ここまで)
この前、Unity 4からダイナミックフォント(Dynamic Font)が使用可能になるという話が出ていましたが現行のUnityでも使用可能にするプラグインを作成した方が登場しました。

プラグインはこちらで配布されています。ビルド後のものは「unity-sysfont plugin package」や「Demo package」のリンクをクリックするとダウンロード出来ます。

imkira/unity-sysfont
https://github.com/imkira/unity-sysfont

「unity-sysfont plugin package」(unity-sysfont-demo.unitypackage)の方がメインの部分、「Demo package」(unity-sysfont.unitypackage)はデモのパッケージとなっています。

デモを使う場合にも unity-sysfont-demo.unitypackage のパッケージが必要なのでデモを試す時は注意して下さい。

自分のプロジェクトで使う場合には unity-sysfont-demo.unitypackage をインポートした後に以下の手順を行います。

1. Main Camera の Inspector から Projection を Orthographic に変更。 Size を 300 (ここの値は必要に応じて調整)に変更。
2. 空のGame Objectを作成。 Position を (0, 0, 0) に
3. それを選択した状態でメニューから「Component」→「SysFont」→「Text」を選択
4. Inspector にて Text に任意のテキストを入力、 iOS/Mac OSX Font に HiraKakuProN-W3 や HiraKakuProN-W6 など(英語のみ使うので有れば他のフォントでもOK)を設定

これで実行すると以下の2つのエラーが出ました。

Component MeshFilter could not be loaded when loading game object. Cleaning up!
Component MeshRenderer could not be loaded when loading game object. Cleaning up!

このエラーについてはProjectビューの中から Plugins/SysFont/SysFontText を開き、以下の部分の .hideFlags に設定している2ヶ所を変更すればOKです。

    if (_filter == null)
    {
      _filter = gameObject.GetComponent<MeshFilter>();
      if (_filter == null)
      {
        _filter = gameObject.AddComponent<MeshFilter>();
        _filter.hideFlags = HideFlags.HideInInspector | HideFlags.DontSave;
      }
    }

    if (_renderer == null)
    {
      _renderer = gameObject.GetComponent<MeshRenderer>();
      if (_renderer == null)
      {
        _renderer = gameObject.AddComponent<MeshRenderer>();
        _renderer.hideFlags = HideFlags.HideInInspector | HideFlags.DontSave;
      }

それぞれ、以下の様に変更。

        _filter.hideFlags = HideFlags.HideInInspector | HideFlags.DontSave;

   ↓

        _filter.hideFlags = HideFlags.HideInInspector;
        _renderer.hideFlags = HideFlags.HideInInspector | HideFlags.DontSave;

   ↓

        _renderer.hideFlags = HideFlags.HideInInspector;

実際に使ってみたものをキャプチャしたものがこちらになります。
※テキストを表示した部分のみ切り取っています。
【 HiraKakuProN-W3 を指定したもの】

【 HiraKakuProN-W6 を指定したもの】