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
相关产品推荐
相关产品推荐

