LoginSignup
1
0

More than 1 year has passed since last update.

【Unity】【TextMeshPro】Unicodeでスプライトに置き換える

Posted at

Unity 2020.3.11f1


Text Mesh ProSprite Asset の設定項目に Unicode があり、それの利用方法がイマイチ見つからなかったので
ここにまとめてみました。
0_0_0.jpg

やりたいこと

自分で用意した数字やハイフンのテクスチャText Mesh Pro で表示したい。

Sprite Asset を使用すればいけそうだということは分かったが、それを使うのにいちいちタグを入れなければいけないのが気になった。
そして、何やら設定に Unicode があるぞ…ということから、そのあたりを調査してみた。

0_0_1.jpg を表示するのに 0_0_2.jpg のような入力をするのが、ちょっと嫌だ。

先にちょっと仕組みを解説

入力された文字が Font Asset に登録した文字の中に無かった場合は
次に Sprite Asset から Unicode が一致するスプライトを引っ張ってきます。
※ Unity 2018.4.36f1 のソースコードにより。
shikumi.jpg

手順

テクスチャ(スプライト)を用意

テクスチャを用意しUnityにインポートします。
今回は↓の画像を使用します。
num.gif
ファイル名は num.png とします。
※ Qiita上ではpngだとでなんかうまく表示してくれなかったので上に貼ってある画像はgifになっています。

スプライトの InspectorSprite ModeMultiple にして Sprite Editor で分割しておきます。
1つのサイズは下記画像のように 64x64 とします。
sprite_slice.jpeg

Sprite Asset を作成

先ほど用意したテクスチャ(下画像)を 右クリックCreateTextMeshProSprite Asset を選択。
1_2_0.jpg
これでテクスチャと同名の Sprite Asset (下画像)が作成されるはずです。
1_2_1.jpg

スプライトとUnicodeを紐づける

Sprite AssetInspector から Sprite Character Table の各スプライトに Unicode を設定します。
今回で言うと 1 = 31, 2 = 32 ... 8 = 38, 9 = 39, 0 = 30, -(ハイフン) = 2D という感じです。
1_3_0.jpeg

詰まったこと

Unicode欄に入力してもデフォルトの値(FFFE)に戻されてしまう
入力後、Enterキーを押したり、別のスプライトを選択したりしても入力した内容が保存されず、リセットされて FFFE になってしまう。
解決  入力後、他の項目、例えば Name などをアクティブ(マウスカーソルを合わせてクリック)にすると入力した値が反映される。
   以降、決定操作とする。

ハイフンのUnicodeの入力を受け付けてくれない
Sprite Character Table にハイフンを設定する時に Unicode 欄に 2D を入力するが受け付けてくれない。
入力して決定操作をした時に FFFE に戻されてしまう。
解決  Unityをいったん閉じ、プロジェクトを開く直すと受け付けてくれるようになった。
   ハイフンでのみ、この現象が起きたが、もしかしたら他の文字でも起きる可能性はある。
   なんでこんなことになるのかは謎。

Font Asset の作成

任意のフォントから Font Asset を作成します。
今回は ReplaceSpriteAsset という名前の Font Asset になっております。
(あとで気付いたが名前に SpriteAsset がついててややこしい。このデータは Sprite Asset ではなくて Font Asset です。)
Font Asset Creator で登録する文字の指定は _(アンダーバー) のみにします。(理由は後述)
1_4_0.jpeg
※ ReplaceSpriteAsset というのは、TextMeshPro付属のフォント LiberationSans から作ったフォントアセットです。

Text Mesh Pro を配置して画面に表示させる

HierarchyText Mesh Pro を配置します。
InspectorMain SettingsFont Asset には先ほど作成した Font Asset を設定します。
1_5_0.jpeg

Extra SettingsSprite Asset には先ほど作成した Sprite Asset を設定します。
1_5_0.jpeg

結果

Text Mesh Pro のテキストに 01234567890- と入力すると、 Sprite Asset に設定したスプライトが表示されるはずです。
spriteタグは必要ありません。
1_6_0.jpg

枠からちょっとはみ出してるのは Extra SettingsMargins で調整すればよさそう。
1_6_2.jpg
上の数字は Text Mesh Pro のデフォルト、下の数字は今回対応したもの

詰まったこと

警告 Unable to add the requested character to font asset (略)
解決  Font Asset 内にある (Font Asset名) Atlas (下画像参考)というものの設定 Is Readable にチェックを入れる。
1_6_1.jpg
   詳しくは警告メッセージを検索したら出てくるので割愛。

ハイフンだけ自分が用意したテクスチャに置き換わってくれない
Font Asset でアンダーバーのみ登録した理由にもなります。
解決  Font Asset を作る際に文字を全く登録しないで作った場合
    Is Readable にチェックを入れて保存した時に勝手にハイフンが作られる。
   適当に使わない文字を1つだけ登録することでこのようなことは起きなかったので
   とりあえずこれで解決とした。

NULLアクセスのエラーが発生する
エディタ上でテキストを入力すると、TextMeshProの処理内でNULLアクセスのエラーが発生する。
解決   Unityを再起動したら発生しなくなり、SpriteAssetのテクスチャがちゃんと表示されるようになった。謎。

怪しい…

Sprite AssetのSprite Character Tableの順番を入れ替えたら表示の順番も変わってしまう
今回を例えで言うと[1][2][3][4][5][6][7][8][9][0][-]と登録しているのを、[0]を一番前にして[0][1][2][3][4][5][6][7][8][9][-]とする。
Text Mesh Pro のテキストには 01234567890- と入力してこの通りに表示されていたのが
並び替え後は 9012345678- と表示されてしまう。
Unicode をもとにスプライトが決定されてるハズで表示に影響する気はしないのだが…

所感

Text Mesh Pro の最大の利点であろうアウトラインやその他もろもろの効果が反映されないどころか色も変えられませんので注意。

この記事のトップの やりたいこと に書いたもの自体は達成できたのですが
マイナスなら赤文字にしようとか思っていて、そういった事はできなさそうで…
※ もしかしたらマテリアルをどうにか操作できたらいけるのかな?

Text Mesh Pro ではなく、ただの Text なら Custom Font で同じことができて色変えもできるので
自分のような使い方をしたいなら単純に Text + Custom Font でよさそうかも。
Text Mesh Pro の機能を使いたいならフォント(.ttf)を用意する感じですかね。

Custom FontText Mesh Pro で使えないみたいで残念。
これができれば今回のようなことはやらなかったな。

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0