SaveManager

Ниже приведен полный пример реализации для тестовой сцены города Ротарк. Важно понимать, что сохранение и загрузка, это сложный процесс, который не ограничивается управлением записи/загрузки классом SaveManager, но это корень этого управления. В нем вы описываете какие данные вы будете записывать/загружать и в каком порядке (см. SetProtocolSave()/SetProtocolLoad()). Ссылку на себя предосавляет World во время инициализации (см. пример в SaveCatalog). Он же реализует интерфейс ILoadManager, который здесь предоставляется через ILoadGet() (см. ILoadManager). Методы SaveBin() и LoadBin() запускают непосредственно сохранение или загрузку через прямые конвертации (систему DirectConvert).

public class SaveManager : SaveManager0
{
    public World World; 

    protected override ILoadManager ILoadGet()
    {
        return World as ILoadManager;
    }

    private void SetProtocolSave()
    {
        dConvert.Clear();
        dConvert.Set(World.Society.People.Values.ToList());
        dConvert.Set(World.Society.AllAgentPoint);
        dConvert.Set(World);
    }

    protected override void SaveBin(string argDirName, string argFileName)
    {
        SetProtocolSave();
        // Выполнение сохранения системой DCovert
        dConvert.Save(argDirName + "\\" + argFileName + ".bin", ConvertorType.Text);
    }

    private List<Person> AllAgent = new List<Person>();
    private void ClearMainList()
    {
        AllAgent = null;
    }

    private void SetProtocolLoad()
    {
        dConvert.Clear();
        LogicBound(AllAgent);
        SceneBound(World.Society.AllAgentPoint);
        dConvert.Set(World, ListCreateMode.UseCurrent);
    }

    protected override bool LoadBin(string argDirName, string argFileName)
    {
        bool isLoadError = false;
        SetProtocolLoad();
        try
        {
            // Выполнение загрузки системой DConvert
            dConvert.Load(argDirName + "\\" + argFileName + ".bin", ConvertorType.Text);
        }
        catch (Exception ex)
        {
            UnityEngine.Debug.LogError("Load Error: " + ex.Message);
            isLoadError = true;
        }
        ClearMainList();
        return isLoadError;
    }
}

Списки всех агентов (World.Society.People, см. Person) и всех зданий, где они бывают (точек агентов) (World.Society.AllAgentPoint, см. AgentPoint) это типовой пример массовых игровых концепций, которые непосредственно находятся на сцене в виде префабов имея визуальное представление в игровой сцене. Рекоммендуется все такого рода игровые концепты находящиеся непосредственно на сцене, записывать предварительно списками. Тогда в производных классах, которые вам нужно будет сохранить, будут только ссылки на них. Поэтому уже имеющейся словарь World.Society.People (преобразовав в список) и список World.Society.AllAgentPoint вначале записываем с полным содержимым (см. код выше SetProtocolSave()). А потом, записывая объект World, свойства содержащие эти списки будут записаны используя только уникальные идентификаторы.