版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室 https://blog.csdn.net/u010019717/article/details/87023701
在UI上显示数字是很常见的行为, 并且数字经常改变。 例如 得分, 伤害数字, hp,属性等等。
怎么怎么产生的 GC Alloc?
是 将数字转换为String (int.ToString() 时)发生的。
如何避免?
1、使用 SetChatArray(...)
// 例1、结果:TEST1
int [] characters1 = new int [] {84,69,83,84,49};
label.SetCharArray(characters1,0,characters1.Length);
// 例2、结果:Test2
char [] characters2 = new char [] {'T','E','S','T','2'};
label.SetCharArray(characters2,0,characters2.Length);
其中的int 类型代表的时Unicode 数字0~9 对应int 48到 57
例子:
位数固定,使用0补位显示
using UnityEngine;
using TMPro;
public class ShowCharacter : MonoBehaviour
{
[SerializeField]
TextMeshProUGUI label;
[Range(0, 99999)]
[SerializeField]
int count;
int[] characters = new int[5];
void Update()
{
var value = count;
for (int i = characters.Length - 1; i >= 0; i--)
{
characters[i] = (value % 10) + 48;
value /= 10;
}
label.SetCharArray(characters, 0, characters.Length);
}
}
位数不固定,有多少位显示多少位
using UnityEngine;
using TMPro;
public class ShowCharacter2 : MonoBehaviour
{
[SerializeField]
TextMeshProUGUI label;
public int Count;
int[] characters = new int[5];
void Update()
{
var digit = (Count == 0) ? 1 : ((int)Mathf.Log10(Count) + 1);
var value = Count;
for (int i = digit - 1; i >= 0; i--)
{
characters[i] = (value % 10) + 48;
value /= 10;
}
label.SetCharArray(characters, 0, digit);
}
}
想要和刚刚用0填充一样,可以这样改一下
using UnityEngine;
using TMPro;
public class ShowCharacter4 : MonoBehaviour
{
[SerializeField]
TextMeshProUGUI label;
[Range(0, 99999)]
[SerializeField]
int count;
char[] characters = new char[5];
const char zero = '0';
void Update()
{
var value = count;
for (int i = characters.Length - 1; i >= 0; i--)
{
characters[i] = (char)((value % 10) + zero);
value /= 10;
}
label.SetCharArray(characters, 0, characters.Length);
}
}
2、使用 SetText(...)
// 例3
int value = 12345;
label.SetText("value:{0}", value);
// 例4 浮点数,负数
float valueF = -123.41234f;
label.SetText("valueF : {0:2}", valueF); // 小数点后两位
例子:
using UnityEngine;
using TMPro;
public class ShowCharacter3 : MonoBehaviour
{
[SerializeField]
TextMeshProUGUI label;
public int Count;
void Update()
{
var value = Count;
label.SetText("<size=50%>value</size> {0}", Count);
}
}
请注意,GC在编辑器中是有的
当你在编辑器上运行和实际构建它时,行为是不同的。 如果使用编辑器则会发生GC。
可能是编辑器的 InputBox 中显示字符导致的吧
参考: