You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
}

效果截图:

计数器显示为0的效果

注:脚本挂载在TextMeshPro元素上

疑问:

  1. 我是否正确使用了TextMeshPro?
  2. 如何更好地使用它?
  3. 代码中是否存在错误?
  4. 该如何修复这个问题?

问题解答

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");
}

修复要点:

  1. 移除Start()里的局部变量声明,直接给类的成员变量textsss赋值;或用[SerializeField]在面板拖拽绑定,更稳妥。
  2. 初始化moneyNow为moneyStart,确保初始显示正确。
  3. 收集金币后更新moneyNow的值,保证数值持续累加。
  4. 封装UpdateMoneyText方法,统一处理文本更新逻辑。
  5. 收集金币后销毁金币对象,避免重复触发碰撞。

内容的提问来源于stack exchange,提问作者TheOdinBorson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:24:18