C # Unity Serialized Hashtable никогда не будет назначен - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над игрой. У меня есть класс ProgressControl, который отслеживает прогресс игроков, сохраняет и загружает его в двоичный файл. Сериализация золота и очков работает. Теперь я хочу добавить Hashtable, чтобы сохранить очки для каждого уровня, чтобы ограничить максимальное количество очков, которое игрок может получить на каждом уровне. Но Hashtable в Serializable Class никогда не назначается и остается нулевым. Таким образом, очки не сохраняются.

Как я могу получить сериализованный Hashtable? Чего мне не хватает?

using UnityEngine;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections;

public class ProgressControl : MonoBehaviour
{
    public static ProgressControl progress;
    public int gold;
    public int points;
    public int level;
    public Hashtable h;

void Awake()
{
    h = new Hashtable();

    if (progress == null)
    {
        DontDestroyOnLoad(gameObject);
        progress = this;

    }
    else if (progress != this)
    {
        Destroy(gameObject);
    }
}

public void save()
{
    BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
    PlayerData data = new PlayerData();

    data.gold = gold;
    data.points = points;
    data.h = h;

    bf.Serialize(file, data);
    file.Close();
}

public void load()
{
    if (File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
        PlayerData data = (PlayerData)bf.Deserialize(file);
        file.Close();

        gold = data.gold;
        points = data.points;
        h = data.h;
    }

}

public void saveLevel()
{
    level = TargetScript.activeLevel;
    Debug.Log("Level Saved");
}

public void savePointsToHashMap(int LevelKey, int points)
{
    if (h.ContainsKey(LevelKey))
    {
        object value = h[LevelKey];
        int compare = int.Parse(value.ToString());
        if (compare < points)
        {
            h.Add(LevelKey, points);
            Debug.Log("Overwrite and Save Points");

        }
    }
    else{
        Debug.Log("Save Points");
        h.Add(LevelKey, points);
    }
    save();
}
}

[Serializable]
class PlayerData
{
    public int gold;
    public int points;
    public Hashtable h;

}
...