【Unity】Text Mesh Pro で数字を表示する時に GC Allocの発生を防ぐことができる拡張メソッド作りました
Text Mesh Pro で数字を表示する時に GC Allocの発生を防ぐことができる拡張メソッド作りました。
Text Mesh Proで数字を表示される場合、GC Allocが発生します。
詳細は、いろんな方が記事に書いて頂いているのでそちらを参照してください。
テラシュールブログ様のリンク
また、TextMeshProでGC Allocを発生させない方法としてSetText関数が準備されていますが、float型の引数になっているため、
大きな整数値の場合は誤差が発生してしまいます。
こちらの詳細も他の方が既に記事にして頂いているので、そちらを参照してください。
まさかみブログ様のリンク
上記2つの問題を解決した上で、メソッドにパラメータを渡すだけのシンプルな方法で数字を表示することができないか考えた結果、
関数内でSetCharArrayを呼び出す、Text Mesh Proの拡張メソッドを作成することにしました。
↓のリンクからリポジトリに飛べるようになっています。
TMProExtensions.cs
以下に、ソースを記載しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// ---------------------------------------------------------------- // Copyright (c) 2020 ほのぼのきっし // // This software is released under the MIT License, see LICENSE. // https://github.com/honobonoK/TMProExtensions/blob/main/LICENSE // // TMProExtensions.cs // Author honobonoK // Version 1.0.0 // ---------------------------------------------------------------- using UnityEngine; using UnityEngine.UI; using TMPro; namespace Honobono.Unity.Utils { #region Extensions /// <summary> /// TMPro 拡張用 クラス /// </summary> public static class TMProExtensions { /// <summary> /// TextMeshProに数字を表示時、GC発生無しでテキスト更新する。 /// (SetTextメソッドを利用した場合、UnityEditor上でGCが観測されるため) /// ※ 常用対数利用のため、負の値は未サポートです。 /// </summary> /// <param name="num">表示させたい数字</param> /// <param name="maxDigit">表示させたい数字のMax桁数の配列</param> public static void SetTextNonAlloc(this TextMeshProUGUI tmPro, int num, int[] maxDigit) { var digit = (num == 0) ? 1 : ((int)Mathf.Log10(num) + 1); for (int i = digit - 1; i >= 0; i--) { maxDigit[i] = (num % 10) + 48; num /= 10; } tmPro.SetCharArray(maxDigit, 0, digit); } } #endregion } |
使い方サンプルは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using Honobono.Unity.Utils; public class TMProExtensionsSample : MonoBehaviour { [SerializeField] TextMeshProUGUI TextMeshPro; int[] output = new int[3]; void Start() { ShowText(999); } void ShowText(int num) { TextMeshPro.SetTextNonAlloc(num, output); } } |
ゲームなどのパフォーマンスが求められるアプリのスコア表示等に利用してみてください!