【unity】スクリプトで任意の数字の画像を表示する3
2022/09/28
Unity version : 2021.1.2.7f1 Personal(日本語化済み)

PCゲームなどを作る場合に考えることとして、プレイする環境(端末)によっては使いたい文字フォントが無いことがあります。
特にスコアなど数字の表示は欲しいところです。

UI(uGUI)で表示することにし手動でシーンに配置するオブジェクトは最小限にするため、スクリプト使います。
前回ではスプライトアニメーションを使い、テクスチャの任意の位置を表示しました。
まず、基本形として複数の桁を表示します。スクリプトでは10桁まで対応します。

基本形が完成すると次の画像のようになります。

順を追って説明します。

描画の起点となるUIのImageオブジェクトを作成しシーンに配置します。
オブジェクトの名前を "NumberImage2" に変更します。
"NumberImage2" のインスペクター上で、テクスチャに数字画像を指定します。
数字画像は次の画像のようにします。


文字は実行時に色変更が容易な白色とします。
背景は透明とし透明要素(アルファ値)「あり」のデータです。
インスペクターに登録したら以下の設定を行います。
  • テクスチャタイプ:スプライト(2DとUI)
  • スプライトモード:複数
  • メッシュタイプ:完全な矩形
  • SpriteEditorでスプライトを分割する。
各設定を変更したら、忘れずに適用ボタンで設定を反映してください。
次の画像のようになります。 (UIの表示は"0"が標準です。画面では2になっていますが動作に問題はありません。

次に、新規のマテリアルを作成し、"NumberImage2" のマテリアルに指定します。
今回の対象は UI の Image なので、マテリアルのシェーダーを "UI/Default" に変更します

Imageオブジェクトに次のコードのファイルをアタッチします。

TextureTest2.cs

スクリプトの大まかな流れです。

  1. 現在のImageのシェーダー情報を取得します。
  2. Imageからテクスチャのサイズを取得します。
  3. テクスチャ1つ分のオフセット幅を計算し取得します。
  4. 表示したい数値の現在の処理桁の数字を取得します。
  5. 新しいオブジェクト(インスタンス)を作成します。
  6. テクスチャの参照先を取得します。
  7. 取得したシェーダーを元に新しいマテリアルを作成します。
  8. 表示したい位置へ左からオフセット分だけ移動した位置、マテリアルのオフセットに格納します。
  9. 色を変更します。
  10. 現在のImageに新しいマテリアルを適用します。
  11. 最上位-1桁まで4~10を繰り返します。
  12. 取得したシェーダーを元に新しいマテリアルを作成します。
  13. 最上位桁("NumberImage2" オブジェクト)の色を変更します。
  14. 最上位桁に新しいマテリアルを適用します。
15.実行終了時に新しく作ったマテリアルを破棄(メモリ開放)します。

画像が真っ黒になってしまったときは...

シーンにライトが設定されてなかったり "NumberImage2" に対して不適切な角度で当たっていたりしています。
ライト(環境光)の設定は・・・
メニューバー -> ウィンドウ -> レンダリング -> ライティング
を選択すると出てきますので、ぜひ確認してみてください。

応用例:カウントアップタイマー

スクリプトは下記のようになり、TextureTest2.cs からの追加・変更箇所は色付けしています。
(現在:EDGEで閲覧すると色が付いて見えません。すみません。)
TextureTest3.cs

注)スクリプトで新しいマテリアルを作成した場合、ゲーム終了時必ず破棄してください。
そのままでは、メモリ上に残ってしまい、メモリリークの原因となるからです。
当コード上では、 OnDestroy() 内で破棄しています。

(参考)下記のサイトを参考にさせていただきました。この場を借りて感謝申し上げます。

※Unity C# 数字を画像で描画するScript(syougun360 氏)
https://qiita.com/syougun360/items/eb787fdbdcf100f04114
※【Unity】小ネタ:スクリプトでテクスチャ座標を動かす(Karvan 氏)
https://www.karvan1230.com/entry/2020/10/20/222526

ページトップ