Как загрузить данные объекта, сохраненные в Unity C #? - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу создать универсальную систему хранения в Unity C #.Что мой код не работает?Объект не может быть определен или я написал неправильно?

Если не использовать функции из SaveExtensions, тогда все будет работать.

https://drive.google.com/open?id=1hLFRB2rHj7XcJT6et7TskEa7sLwdmJhP

1 Ответ

0 голосов
/ 21 февраля 2019

Пока ваше сохранение работает, проблема в вашем Load методе.

obj = bf.Deserialize(fs);

это изменение применяется только локально внутри метода, но фактически не меняет значение вызывающего exв

ex.Load("asd", ".dat", SaveExtension.Path.PersistentDataPath);

Неудобно ref и out недопустимы в методах расширения, поэтому один обходной путь мог бы дать методу правильное возвращаемое значение вместо этого (я также внес некоторые изменения в остальную частьВаш код):

[System.Serializable]
internal static class SaveExtension
{
    public enum Path 
    { 
        PersistentDataPath, 
        TemporaryCachePath 
    }

    public static void Save(this object obj, string name, string type, Path path)
    {
        var pathString = "";

        switch (path)
        {
            case Path.PersistentDataPath:
                pathString = Application.persistentDataPath;
                break;
            case Path.TemporaryCachePath:
                pathString = Application.temporaryCachePath;
                break;
        }

        // There is no need to create the file 
        // in a dedicated if block since it will be created anyway
        // Additionally: You did only create a new file but due to
        // if-else you didn't write to it the first time

        Debug.Log("[SaveSystem]: File " + name + type + " already exist!");
        Debug.Log("[SaveSystem]: Location: " + pathString + "/" + name + type);

        var bf = new BinaryFormatter();
        using (var fs = File.Open(pathString + "/" + name + type, FileMode.Open, FileAccess.Write))
        {
            bf.Serialize(fs, obj);
        }

        Debug.Log("[SaveSystem]: Object succesful serialized!");
    }

    public static T Load<T>(this T obj, string name, string type, Path path)
    {
        var output = default(T);

        var pathString = "";

        switch (path)
        {
            case Path.PersistentDataPath:
                pathString = Application.persistentDataPath;
                break;
            case Path.TemporaryCachePath:
                pathString = Application.temporaryCachePath;
                break;
        }

        if (!File.Exists(pathString + "/" + name + type))
        {
            Debug.LogFormat("File " + pathString + "/" + name + type + " not found! returning default value.");
            return output;
        }

        var bf = new BinaryFormatter();
        using (var fs = File.Open(pathString + "/" + name + type, FileMode.Open))
        {
            output = (T)bf.Deserialize(fs);
        }

        Debug.Log("[SaveSystem]: Object succesful deserialized!");

        return output;
    }
}

и используйте его как

ex = ex.Load("asd", ".dat", SaveExtension.Path.PersistentDataPath);

Таким образом, this T obj используется только для определения типа T


Подсказка: вам никогда не следует использовать Debug.Log внутри Update ... для отладки, просто переключите Inspector в Unity на Debug режим , чем вы можете напрямуюсмотреть приватные поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...