如何区分新旧实例化对象?Unity图标插槽替换技术问询
如何在Unity中区分插槽内的新旧实例化图标并替换旧图标?
嘿,我来帮你搞定这个问题!你现在的需求是把图标实例化到指定插槽,当新图标要放进已有旧图标的插槽时销毁旧图标——核心就是要追踪每个插槽当前对应的图标实例,这样就能轻松区分新旧啦。下面给你两种实用的实现方式:
方法1:利用父子关系+标签识别(简单直接)
既然你是把图标实例化到插槽的位置,不如直接把新图标设为插槽的子物体,这样每个插槽的子对象里就只会有当前的图标。再给图标加个专属标签,就能快速找到旧图标并销毁:
public void PlaceIconToSlot() // 按钮调用的方法 { Transform targetSlot = Slots[properSlotIndex].transform; // 先检查插槽里有没有旧图标(通过标签识别) foreach (Transform child in targetSlot) { if (child.CompareTag("SlotIcon")) { Destroy(child.gameObject); break; // 每个插槽只存一个图标,找到就停 } } // 实例化新图标,设置父物体为插槽,同时打上标签 GameObject newIcon = Instantiate(Icons[properIconIndex], targetSlot.position, Quaternion.identity); newIcon.transform.SetParent(targetSlot); newIcon.tag = "SlotIcon"; }
注意:要先在Unity编辑器里创建好
SlotIcon这个标签,给所有图标预制体都打上这个标签哦。
方法2:用字典存储插槽与图标的映射(高效精准)
如果觉得遍历子对象效率不够高,可以用字典来直接记录每个插槽对应的当前图标实例,这样查找和删除都更快捷:
// 在类的成员变量里定义字典,用来追踪每个插槽的当前图标 private Dictionary<Transform, GameObject> slotIconMap = new Dictionary<Transform, GameObject>(); public void PlaceIconToSlot() // 按钮调用的方法 { Transform targetSlot = Slots[properSlotIndex].transform; // 检查字典里有没有该插槽的旧图标记录 if (slotIconMap.ContainsKey(targetSlot)) { Destroy(slotIconMap[targetSlot]); slotIconMap.Remove(targetSlot); // 销毁后移除旧记录 } // 实例化新图标并设置父物体 GameObject newIcon = Instantiate(Icons[properIconIndex], targetSlot.position, Quaternion.identity); newIcon.transform.SetParent(targetSlot); // 将新图标存入字典,绑定到对应的插槽 slotIconMap[targetSlot] = newIcon; }
这两种方法都能完美解决你的问题,核心思路就是给每个插槽绑定一个当前图标的唯一引用,这样每次新图标要放入时,先找到旧的销毁,再放置新的就好啦。
内容的提问来源于stack exchange,提问作者Dimi Nemt
相关产品推荐
相关产品推荐

