Unity金币收集系统:Debug正常但TextMeshPro计数显示始终为0求助
金币收集系统TextMeshPro显示异常问题
我制作了一个玩家触碰球形“金币”时增加计数器数值的金币收集系统,已通过Debug.Log验证计数功能正常,但使用TextMeshPro显示该数值时,它始终停留在0。
代码如下:
public float moneyStart; public float unit; public float moneyNow; public float displayedMoney; private TextMeshPro textsss; void Start() { TextMeshPro textsss = GetComponent<TextMeshPro>(); } void OnCollisionEnter(Collision C_Info) { if (C_Info.collider.tag == "Currency") { displayedMoney = moneyNow + unit; textsss.text = displayedMoney.ToString("0"); } }
效果截图:

注:脚本挂载在TextMeshPro元素上
疑问:
- 我是否正确使用了TextMeshPro?
- 如何更好地使用它?
- 代码中是否存在错误?
- 该如何修复这个问题?
问题解答
1. 是否正确使用了TextMeshPro?
核心使用逻辑没问题,但代码里的变量赋值错误导致TextMeshPro组件没被正确引用,最终引发显示异常。
2. 如何更好地使用TextMeshPro?
- 优先用
[SerializeField]序列化字段,直接在Inspector面板拖拽绑定TextMeshPro组件,比代码获取更直观且不易出错。 - 数值显示可封装成独立更新方法,避免重复代码;如果需要平滑过渡数值,可用协程或DOTween插件实现动画效果。
- 注意文本格式化,比如整数显示用
ToString("N0")、保留两位小数用ToString("F2"),提升显示规范性。 - 避免在碰撞、Update等高频调用方法里直接拼接字符串,可缓存格式化后的字符串或用StringBuilder优化性能。
3. 代码中是否存在错误?
有两个关键错误:
- 变量作用域问题:
Start()方法里重新声明了局部变量textsss,没有给类的成员变量textsss赋值,导致OnCollisionEnter里的textsss始终为null,无法更新文本。 - 数值逻辑问题:
displayedMoney = moneyNow + unit后,未更新moneyNow的值,下次收集金币时仍用旧值计算,数值无法持续累加。
4. 该如何修复这个问题?
修改后的代码如下:
public float moneyStart; public float unit; public float moneyNow; public float displayedMoney; // 序列化字段,方便在Inspector面板绑定组件 [SerializeField] private TextMeshPro textsss; void Start() { // 初始化当前金币值 moneyNow = moneyStart; // 若未在面板绑定,再通过代码获取组件 if(textsss == null) { textsss = GetComponent<TextMeshPro>(); } // 初始化显示文本 UpdateMoneyText(); } void OnCollisionEnter(Collision C_Info) { // 用CompareTag比直接判断tag性能更好 if (C_Info.collider.CompareTag("Currency")) { // 累加金币值 moneyNow += unit; displayedMoney = moneyNow; // 更新显示文本 UpdateMoneyText(); // 销毁已收集的金币,避免重复触发碰撞 Destroy(C_Info.gameObject); } } // 封装文本更新方法,统一逻辑便于维护 private void UpdateMoneyText() { textsss.text = displayedMoney.ToString("0"); }
修复要点:
- 移除
Start()里的局部变量声明,直接给类的成员变量textsss赋值;或用[SerializeField]在面板拖拽绑定,更稳妥。 - 初始化
moneyNow为moneyStart,确保初始显示正确。 - 收集金币后更新
moneyNow的值,保证数值持续累加。 - 封装
UpdateMoneyText方法,统一处理文本更新逻辑。 - 收集金币后销毁金币对象,避免重复触发碰撞。
内容的提问来源于stack exchange,提问作者TheOdinBorson
相关产品推荐
相关产品推荐

