unity遇到的坑----背包篇---强化装备影响其他装备属性

[亡魂溺海] 提交于 2020-02-23 01:36:13

学习完基础的背包系统,发现一个问题。背包里强化装备或者升级装备时,同名装备的属性也会发生变动。
这个问题一度让我十分苦恼,网上也找不到原因。
后来发现初始化背包时,实例化的同名物品指向的地址相同,也就是说所有同名装备都是一个物体,对任意一个装备进行操作都会改变这个装备的同名装备。
解决办法:
序列化克隆每一个装备对象,使他们指向不同地址。
步骤:
第一,在装备类前加上[System.Serializable],使其可序列化

[System.Serializable]  //表示该类可以序列化的意思
public class Iventory()
{
}

第二,装备类对象序列化

//必要的引用
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;  

public class Main()
{
private arraylist<iventory> list = new arraylist<iventory>();
private Iventory item = new Iventory();

void xuliehua()
{
/*序列化前:id = 1001
item和it是引用类型,地址相同,改变item,it也会跟着改变*/
item = list[1];
Iventory it = list[1];
var a = item;

//序列化,item的地址指向新的托管堆,对item进行操作
item = DeepClone(a) as Iventory;
item.id = 1003;

/*序列化后item.id = 1003   it.id = 1001
对item进行操作,it的值并不会改变*/
}
//序列化函数
   public static object DeepClone(object obj)
    {
        BinaryFormatter bFormatter = new BinaryFormatter();
        MemoryStream stream = new MemoryStream();
        bFormatter.Serialize(stream, obj);
        stream.Seek(0, SeekOrigin.Begin);
        return bFormatter.Deserialize(stream);
    }
}

克隆对象之后,每件装备指向不同地址,操作一个不会影响其他。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!