Unity3D项目中arthursButtonsDescription数组赋值异常问题求助
问题根因
你这里的问题核心是引用类型赋值逻辑错误:Equipment是继承自MonoBehaviour的类,属于引用类型,你在SaveLoadStarter.LoadClick()方法里只调用了一次gameObject.AddComponent<Equipment>(),全程只创建了1个Equipment实例,后续两次修改itemToEquip的name和equipSlot属性、存入arthursButtonsDescription数组的都是同一个实例的引用,自然你改第二次属性的时候,数组里两个位置指向的同一个对象的属性都会同步变化。
修复方案
你需要在第二次赋值前重新创建一个新的Equipment实例,修改代码如下:
public class SaveLoadStarter : MonoBehaviour { public void LoadClick() { // 第一个装备实例:头 Equipment itemToEquip = gameObject.AddComponent<Equipment>(); itemToEquip.name = "0"; itemToEquip.equipSlot = EquipmentSlot.Head; Debug.Log("iTE0: " + itemToEquip.name); EquipmentManager.instance.Equip(itemToEquip); // 新增:创建第二个装备实例:盾 Equipment itemToEquip2 = gameObject.AddComponent<Equipment>(); itemToEquip2.name = "4"; itemToEquip2.equipSlot = EquipmentSlot.Shield; Debug.Log("iTE4: " + itemToEquip2.name); EquipmentManager.instance.Equip(itemToEquip2); } }
额外优化建议
- 不要反复动态AddComponent创建装备数据,如果你只需要存装备属性不需要挂载到物体上执行逻辑,建议把Equipment改成普通的可序列化类(去掉继承MonoBehaviour),这样创建实例用
new Equipment()即可,性能更好也更符合数据类的使用规范。 EquipmentManager.Equip()方法里不要每次调用都执行FindObjectOfType找ArthurInventory,建议在Awake里只找一次缓存即可,减少不必要的性能消耗。
内容的提问来源于stack exchange,提问作者Mr. Koala
相关产品推荐
相关产品推荐

