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

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

今回もスクリプトを使ってUnityのUI(uGUI)で表示してみます。
前回とはまた別のアプローチをとってみたいと思います。

スプライトアニメーションを使い、テクスチャの任意の位置を表示します。
考え方は次のような感じです。

まず、目標は次の図のように数字一桁の表示を変えることです。

左側が元の数字画像、右側が実行後の画像です。
単純に、数字とその色が変わっただけです。

順を追って説明します。

数字画像は次の画像(注1)のようにします。

背景は黒、文字は白とします。また、透明要素はありません。
ここで、数字画像は以下の設定を行います。

  • テクスチャタイプ:スプライト(2DとUI)
  • スプライトモード:複数
  • メッシュタイプ:完全な矩形
  • SpriteEditorでスプライトを分割する。
各設定を変更したら、忘れずに適用ボタンで設定を反映してください。

描画の起点となるUIのImageオブジェクトを作成しシーンに配置します。
Imageオブジェクトのインスペクター上で、テクスチャに数字画像を指定します。
次に、新規のマテリアルを作成し、Imageオブジェクトのマテリアルに指定します。

今回の対象は UI の Image なので、マテリアルのシェーダーを "UI/Default" に変更します

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

TextureTest.cs

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

  1. 現在のImageのシェーダー情報を取得します。
  2. 取得したシェーダーを元に新しいマテリアル(注2)を作成します。
  3. テクスチャのサイズを取得します。
  4. テクスチャ1つ分のオフセット幅を計算し取得します。
  5. 表示したい位置へ左からオフセット分だけ移動した位置、マテリアルのオフセットに格納します。
  6. 色を変更します。
  7. 現在のImageに新しいマテリアルを適用します。

実行すると、数字と文字色が変わります。

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

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

注1)画像は、アルファ値を含むデータ(r,g,b,a タイプ)を用意します。
今回は持っていなかったので new Color( data.color.r, data.color.g, data.color.b, 1.0f) としました。

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

今回は以上です、最後まで見て頂きありがとうございました。

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

※【Unity】小ネタ:スクリプトでテクスチャ座標を動かす(Karvan 氏)
https://www.karvan1230.com/entry/2020/10/20/222526

ページトップ