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

Unity拾取TargetObj后如何为对应屏幕TextMeshPro文本添加删除线

Unity拾取目标后对应UI文本加删除线实现方案

你现有代码无法实现需求的核心问题:Start阶段创建所有目标名称文本时,仅使用单个TextMeshProUGUI变量存储引用,循环过程中该变量会被反复覆盖,最终仅指向最后一个创建的文本,没有建立「目标游戏对象-对应UI文本」的绑定关系,拾取触发时无法定位到需要修改样式的文本组件。


具体修改步骤

  • 第一步:新增映射字典替换单文本引用
    把类中原有的private TextMeshProUGUI mytext;字段替换为字典结构,用于存储每个目标对象和它对应的名称文本组件,如果代码文件开头没引入泛型命名空间要先补上:

    using System.Collections.Generic;
    
    // 其余原有字段保留不变
    // 替换掉原来的private TextMeshProUGUI mytext;
    private Dictionary<GameObject, TextMeshProUGUI> targetTextMap = new Dictionary<GameObject, TextMeshProUGUI>();
    
  • 第二步:修改Start方法的文本创建逻辑
    循环生成每个目标的名称文本时,将对象和对应文本组件存入字典,不要用单个变量反复覆盖引用:

    void Start()
    {
        mainCamera = Camera.main;
        targetObjects = GameObject.FindGameObjectsWithTag("TargetObj");
        targetObjectsList = new List<GameObject>();
        foreach (var obj in targetObjects)
        {
            TextMeshProUGUI textComp = CreateText(TargetsCanvas.transform);
            textComp.text = "• " + obj.name;
            textComp.font = FontAssetA;
            // 存入映射关系
            targetTextMap.Add(obj, textComp);
        }
    }
    

    原有的CreateText方法不需要做任何修改。

  • 第三步:在拾取成功分支中添加删除线设置
    就在判断拾取对象为TargetObj、将对象加入已拾取列表的代码后,从字典取出对应文本设置样式即可,插入位置如下:

    if (lookObject.CompareTag("TargetObj") && !targetObjectsList.Contains(lookObject.gameObject))
    {
        if (aSource)
        {
            aSource.Play();
        }
        targetObjectsList.Add(lookObject.gameObject);
        // 在此处添加删除线逻辑:拾取成功立即更新对应文本样式
        targetTextMap[lookObject.gameObject].fontStyle = FontStyles.Strikethrough;
    
        if (targetObjectsList.Count == targetObjects.Length)
        {
            winUI.SetActive(true);
            Time.timeScale = 0f;
        }
    }
    

    原有的PickupObject方法不需要做任何修改。


注意事项

  • 如果文本原本设置了粗体、斜体等其他字体样式,不要直接赋值FontStyles.Strikethrough,否则会覆盖原有样式,需要用位或运算拼接样式:
    TextMeshProUGUI targetText = targetTextMap[lookObject.gameObject];
    targetText.fontStyle = targetText.fontStyle | FontStyles.Strikethrough;
    
  • 如果运行时存在动态生成/销毁TargetObj的逻辑,记得同步更新targetTextMap字典内的键值对,避免出现空引用报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:06:25