Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity-如何保存和加载列表(二进制保存和加载)_C#_Unity3d_Serialization_Deserialization - Fatal编程技术网

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#