[ExecuteInEditMode]
public class ModuleEngine : Module
{
public int Power = 100;
public int FuelTaking = 1;
public SaveDataEngine SD;
public override void SaveJSON()
{
ID = GetInstanceID();
SD = new SaveDataEngine( Name, GetInstanceID(), Prefab.name , Cost, ProductionTime, FuelTaking, Power);
string jsonData = JsonUtility.ToJson(SD, true);
File.WriteAllText(Path.Combine(ScenarioManager.instance.CurrentScenario.CurrentFolder, GetInstanceID() + ".Module"), jsonData);
Debug.Log("File Saved at: " + Path.Combine(ScenarioManager.instance.CurrentScenario.CurrentFolder, GetInstanceID() + ".Module"));
}
public override void LoadJSON()
{
SD = JsonUtility.FromJson<SaveDataEngine>(File.ReadAllText(JsonFilePath));
ID = SD.ID;
Name = SD.Name;
ProductionTime = SD.ProductionTime;
Power = SD.Power;
FuelTaking = SD.FuelTaking;
Cost = SD.Cost;
Prefab = Resources.Load<GameObject>("Modules/" + SD.PrefabName);
if(Icon==null) Debug.LogError("Нет иконки у объекта :"+ name);
foreach (var item in ScenarioManager.instance.CurrentScenario.Researches)
{
if (item.SD.ModulesID.Exists(X => X == SD.ID))
{
item.ModulesOpen.Add(this);
item.researchButton.Refresh();
transform.SetParent(item.transform);
}
}
}
[System.Serializable]
public class SaveDataEngine: SaveData
{
public int Cost;
public int[] ProductionTime;
public int Power;
public int FuelTaking;
public SaveDataEngine(string name, int id, string prefabName, int cost, int []productionTime, int fuelTaking, int power)
{
ID = id; Name = name; PrefabName = prefabName; Cost = cost; ProductionTime = productionTime; Power = power; FuelTaking = fuelTaking;
}
}
Комментарий недоступен
потому что они физически существуют в сценах как игровые объекты
Бро, можно юзать JSON .NET For Unity https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347
Он умеет сохранять и дочерние классы
https://stackoverflow.com/questions/8513042/json-net-serialize-deserialize-derived-types
вчера потыкался с ним и удалил, ничего особого он не добавляет по возможностям
Как вариант можно попробовать сделать атрибут для полей, которые хочется сохранять (или просто все сериализуемые поля) и позже через assembly.getTypes (не помню точно) автоматически их в проекте собирать (по атрибуту или каким-то ещё признакам) и сохранять.
Ещё мне кажется, что эффективнее в игре все объекты хранить в виде словаря какого-то, а в момент сохранения в json конвертить этот словарь, а не каждый объект отдельно
суть задачи в том чтобы наследников было сколько угодно типов и чтобы их можно было легко из JSON доставать и создавать не описывая в каждом классе все каждый раз заново, мне кажется я уже придумал как это всё обойти, сейчас пробую. Думаю можно просто при SaveJSON - прямо в имени файла писать имя класса и тогда любой файл сам себя сможет воссоздать прямо из базового класса. Эффективность сохранения файлов в PC игре на HDRP у меня не на первом месте)
Комментарий недоступен