C# Unity-如何保存和加载列表(二进制保存和加载)
我想知道如何保存和加载数据列表。我已经让我的代码处理单个数据,但不确定列表一如何工作。我有一个角色类,这意味着我可以有多个角色,我想保存每个角色的生命,法力等C# Unity-如何保存和加载列表(二进制保存和加载),c#,unity3d,serialization,deserialization,C#,Unity3d,Serialization,Deserialization,我想知道如何保存和加载数据列表。我已经让我的代码处理单个数据,但不确定列表一如何工作。我有一个角色类,这意味着我可以有多个角色,我想保存每个角色的生命,法力等 //SaveManager class that I can call from anywhere to save and load public static class SaveManager { //SAVE public static void Save(Character c) { Bi
//SaveManager class that I can call from anywhere to save and load
public static class SaveManager
{
//SAVE
public static void Save(Character c)
{
BinaryFormatter formatter = new BinaryFormatter();
string path = Application.persistentDataPath + "/Save.save";
FileStream stream = new FileStream(path, FileMode.Create);
PartyData data = new PartyData(c);
formatter.Serialize(stream, data);
stream.Close();
}
//LOAD
public static PartyData Load()
{
string path = Application.persistentDataPath + "/Save.save";
if (File.Exists(path))
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(path, FileMode.Open);
PartyData data = formatter.Deserialize(stream) as PartyData;
stream.Close();
return data;
}
else
{
Debug.Log("Save FIle not Found");
return null;
}
}
}
PartyData类是我用来保存角色数据的
[System.Serializable]
public class PartyData
{
public int hp;
public PartyData(Character cParty)
{
hp = cParty.HP;
}
}
包含统计信息等的字符类
public class Character
{
public int HP { get; set; }
public int Mana { get; set; }
}
最后,我将CharacterParty类附加到游戏对象,该类包含多个角色,并调用保存和加载函数:
public class CharacterParty : MonoBehaviour
{
[SerializeField] List<Character> characters;
public List<Character> Characters
{
get
{
return characters;
}
}
public void SaveParty()
{
SaveManager.SaveMC(characters[0]);
}
public void LoadParty()
{
PartyData data = SaveManager.LoadMC();
characters[0].HP = data.hp;
}
}
public class CharacterParty:monobhavior
{
[序列化字段]列表字符;
公共列表字符
{
得到
{
返回字符;
}
}
公共无效保存方()
{
SaveManager.SaveMC(字符[0]);
}
公众参与方()
{
PartyData data=SaveManager.LoadMC();
字符[0]。HP=data.HP;
}
}
现在出于测试目的,我尝试在索引0处保存并加载角色的生命值,但现在我想保存多个角色的生命值和魔法值等的列表。我只是不知道该列表如何与序列化保存和加载一起工作。我的代码可能需要一些修改才能使列表正常工作,所以我希望有人能用一个例子来帮助我。使用类-这是Unity内置的JSON实用程序
此外,您还可以在不使用[System.Serializable]的情况下序列化任何类
保存:
//当事人名单
列表方=新列表();
//在此处添加您的派对
//第一个参数是类或任何其他对象的实例
//如果第二个参数设置为true,则会使JSON更具可读性
字符串json=JsonUtility.ToJson(parties,false);
// .. 保存文件
负载:
/。。加载文件
//第一个参数是JSON
List parties=JsonUtility.FromJson(json);
// .. 用列表做一些事情
编辑:
如果您确实想使用BinaryFormatter,那么这是为了保存:
List parties=new List();
// .. 添加当事人
序列化(流、参与方)
装载:
List parties=格式化程序。反序列化(流)为列表;
// .. 做事
第二次编辑:
这个应该有用。
你可以这样做:
// Save class
[Serializable]
public class Save
{
public List<PartyData> parties;
// .. add other stuff here
}
// For loading
try
{
// Deserializing the save
Save save = (Save)formatter.Deserialize(stream);
// .. do stuff with other data if you added some
foreach (PartyData data in save.parties)
{
// .. do stuff with data
}
}
catch (Exception e)
{
// .. can you just acnowledge... E
// Oopsie! An error occured. The save file is probably COWWUPTED
Debug.LogWarning($"An error occured while loading the file: {e}");
}
// For saving
List<PartyData> parties = new List<PartyData>();
// .. add parties by calling parties.Add(party_here);
// Creating a save
Save save = new Save();
// Adding parties to save
save.parties = parties;
// Serialize to a file
formatter.Serialize(stream, parties);
//保存类
[可序列化]
公共类保存
{
公开名单缔约方;
//…在这里添加其他内容
}
//装载
尝试
{
//反序列化save
保存=(保存)格式化程序。反序列化(流);
//…如果您添加了一些数据,请使用其他数据
foreach(save.parties中的PartyData数据)
{
//…处理数据
}
}
捕获(例外e)
{
//你能承认吗
//哎呀!发生了一个错误。保存文件可能被压缩了
Debug.LogWarning($“加载文件时出错:{e}”);
}
//为了节省
列表方=新列表();
// .. 通过呼叫方添加参与方。添加(此处为参与方);
//创建保存
保存=新保存();
//添加要保存的参与方
save.parties=当事人;
//序列化为文件
序列化(流、参与方);
Json是一种不安全的保存方式,与我目前所看到的不同。人们可以通过编辑文本来编辑他们的保存文件。Kira,二进制文件也是不安全的,因为每个人都可以简单地编辑任何文件,就像JSON中的一样。afaikI测试了两者,使用JSON,您可以清楚地看出显示的值是什么。但是对于二进制文件,如果你用记事本打开,你会看到奇怪的符号和类名,比如PartyData和单词,比如hp from stat,但是你看不到任何值。它可能不是完美的,我相信有办法解决它,但JSON与二进制相比仍然太简单和不安全。我读到如果你使用JSON,最好的做法是对它加密一点。然后必须将其转换为字节。我只是不知道有任何例子显示保存为JSON然后转换为字节。但无论如何,如果我要使用JSON,那么我必须这样做,转换为字节,我真的不知道如何转换。再次检查答案请使用正确的标记。。。是或更好是早期Unity版本中使用的类似JavaScript风格的自定义语言,现在已经被长期弃用。。。您的代码显然是c#