Пример #1
0
        /// <summary>
        /// Агрегировать сохраняемые данные
        /// </summary>
        /// <returns></returns>
        private static SaveableSceneObjects AggregateSaveableData()
        {
            // Находим все GO, имеющие в компонентах класс SaveableObject, т.е. отмеченные для сохранения
            SaveableObject[] objs = GameObject.FindObjectsOfType <SaveableObject>();

            SaveableSceneObjects aggregatedData = new SaveableSceneObjects();

            // Проходимся по найденным объектам
            foreach (var obj in objs)
            {
                GameObject GO = obj.gameObject;

                // Добавляем в собранные данные информацию о каждом из GO в формате, необходимом для сохранения
                aggregatedData.Add(GO.GetSaveableSceneObject());
            }

            return(aggregatedData);
        }
Пример #2
0
        /// <summary>
        /// Изменить состояние сцены в соответствии с загруженной информацией
        /// </summary>
        /// <param name="objects"></param>
        private static void SetLoadedData(SaveableSceneObjects objects)
        {
            // Сначала очистим сцену от сохраняемых объектов. Не сохраняемые объекты мы не имеем права трогать, т.к. на них не могут влиять
            // механизмы системы сохранения/загрузки
            ClearScene();

            // Проходимся по всем загруженным объектам
            foreach (var obj in objects)
            {
                // Вот так будем подгружать ассеты
                //MonoBehaviour.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Resources/Prefabs/Characters/Robots/Robo3.prefab"), Vector3.zero, Quaternion.identity);

                // Создаем новый объект в нулевой точке на сцене, на основании ассета, загруженного из ресурсов.
                GameObject GO = MonoBehaviour.Instantiate(AssetDatabase.LoadAssetAtPath <GameObject>(obj.PrefabResourcePath), Vector3.zero, Quaternion.identity);

                // Проходимся по всем компонентам загруженного объекта
                foreach (var component in obj.Components)
                {
                    // TODO: Сейчас не поддерживается наличие нескольких компонентов одного типа. Нужно переделать. Возможно стоит разделять разные компоненты по ID...

                    // Находим соответствующие компоненты на созданном объекте
                    var GOComp = GO.GetComponent(component.Type);

                    // Проходимся по всем полям (свойства там тоже могут быть, просто поле надо было как-то назвать понятно и вот поэтому поля)
                    foreach (var field in component.Fields)
                    {
                        var GOMembers = GOComp.GetType().GetMember(field.Name);

                        // Устанавливаем значение полей в соответствии с загруженными значениями
                        switch (GOMembers[0].MemberType)
                        {
                        case MemberTypes.Field:
                            (GOMembers[0] as FieldInfo).SetValue(GOComp, field.Value);
                            break;

                        case MemberTypes.Property:
                            (GOMembers[0] as PropertyInfo).GetSetMethod().Invoke(GOComp, new object[] { field.Value });
                            break;
                        }
                    }
                }
            }
        }
Пример #3
0
 public override void Save(SaveableSceneObjects saveableSceneObjects, string path)
 {
     throw new System.NotImplementedException();
 }
Пример #4
0
 public abstract void Save(SaveableSceneObjects saveableSceneObjects, string path);
Пример #5
0
 /// <summary>
 /// Сохранить игру
 /// </summary>
 public static void Save(SaveableSceneObjects saveableObjects)
 {
     _dataDriver.Save(saveableObjects, "test");
 }
Пример #6
0
 public override void Save(SaveableSceneObjects saveableSceneObjects, string path)
 {
     _savedObjects.Add(path, saveableSceneObjects);
 }