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

Unity拖拽背包系统中替换Legacy Text为Text Mesh Pro的问题

问题:Unity中Text Mesh Pro文本无法清空的排查与解决

我正在制作带快捷栏的拖拽背包系统,ItemPanelHelper脚本用于处理物品UI的核心逻辑:包括显示物品图片、名称和数量,支持重置图片、高亮选中物品、物品交换及数据设置。原本使用Legacy Unity UI Text时功能正常,但换成Text Mesh Pro(TextMeshProUGUI)后,进入运行模式后itemName和itemCount对应的文本无法清空——运行时物品数量999、名称“BIG SHINY”本应被清空却残留。想确认是否正确访问了TMP文本,附上代码寻求反馈。


代码实现

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class ItemPanelHelper : MonoBehaviour
{
    public Action<int, bool> OnClickEvent;

    public Image itemImage;
    [SerializeField]
    private TextMeshProUGUI nameText, countText; // 替换原Legacy Text为TextMeshProUGUI
    public string itemName, itemCount;
    public bool isEmpty = true;
    public Outline outline; // 标记物品是否被选中
    public bool isHotbarItem = false;

    public Sprite backgroundSprite;

    private void Start()
    {
        outline = GetComponent<Outline>();
        outline.enabled = false;
        if(itemImage.sprite == backgroundSprite)
            ClearItem();
    }

    public void SetIventoryUiElement(string name, int count, Sprite image)
    {
        itemName = name;
        itemCount = count + "";
        if (!isHotbarItem)
            nameText.text = itemName;
        countText.text = itemCount;
        isEmpty = false;
        SetImageSprite(image);
    }

    // 用于拖拽系统中交换背包/快捷栏的空物品与非空物品
    public void SwapWithData(string name, int count, Sprite image, bool isEmpty)
    {
        SetIventoryUiElement(name, count, image);
        this.isEmpty = isEmpty; // 此处逻辑可能存在矛盾
    }

    private void SetImageSprite(Sprite image)
    {
        itemImage.sprite = image;
    }

    private void ClearItem()
    {
        itemName = "";
        itemCount = "";
        countText.text = itemCount;
        if (!isHotbarItem)
            nameText.text = itemName;
        ResetImage();
        isEmpty = true;
        ToggleHighlight(false);
    }

    private void ToggleHighlight(bool val)
    {
        outline.enabled = val;
    }

    private void ResetImage()
    {
        itemImage.sprite = backgroundSprite;
    }
}

排查与解决方案

你访问TMP文本的语法是正确的,但以下几个潜在问题会导致文本无法清空:

  1. 序列化字段未赋值
    在Unity编辑器中,务必确认nameText和countText两个TextMeshProUGUI字段已正确拖入场景中对应的TMP组件。未赋值时代码不会报错,但文本更新逻辑会静默失效。

  2. Start方法逻辑漏洞
    当前Start中仅当itemImage.sprite == backgroundSprite时才调用ClearItem(),如果初始状态下itemImage的Sprite不是backgroundSprite,清空逻辑不会触发,导致初始文本残留。可以改为强制在Start时调用ClearItem(),或确保初始Sprite正确设置为backgroundSprite。

  3. ClearItem方法优化
    可直接给TMP文本赋值空字符串,减少中间变量传递的出错概率:

    private void ClearItem()
    {
        itemName = "";
        itemCount = "";
        countText.text = ""; // 直接赋值空字符串
        if (!isHotbarItem)
            nameText.text = "";
        ResetImage();
        isEmpty = true;
        ToggleHighlight(false);
    }
    
  4. SwapWithData逻辑矛盾
    调用SetIventoryUiElement后会将isEmpty设为false,但紧接着又赋值传入的isEmpty参数,导致物品状态混乱。如果是交换空物品,应直接调用ClearItem():

    public void SwapWithData(string name, int count, Sprite image, bool isEmpty)
    {
        if (isEmpty)
        {
            ClearItem();
        }
        else
        {
            SetIventoryUiElement(name, count, image);
        }
        this.isEmpty = isEmpty;
    }
    
  5. TMP组件自身设置
    检查TMP组件的初始Text值是否为空,若存在默认占位文本,空字符串可能无法覆盖;同时查看Extra Settings中的溢出处理,确保空字符串能正确显示为空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:40:29