/// <summary>
        /// Tell the save provider to save the object
        /// </summary>
        /// <param name="targetObject"></param>
        public virtual void Start(SaveObjectInfo targetObject)
        {
            CreateSaveSlot(false); // make sure we have a save slot we can write to

            BeginObjectSave(targetObject.GameObject, targetObject.GuidComponent);
            SaveObject_internal(targetObject);
            FinishObjectSave();
        }
Example #2
0
        public void Start(SaveObjectInfo objectInfo)
        {
            if (!DoesSaveExist(objectInfo.GuidComponent))
            {
                Debug.LogWarning($"Failed to find save for object with id {objectInfo.GetGuid}");
            }

            BeginObjectLoad(objectInfo.GetGuid);

            var componentName = "";

            while (LoadNextComponent(ref componentName))
            {
                var component = objectInfo.GetComponentFromName(componentName);

                if (!component)
                {
                    continue;
                }

                var componentType = component.GetType();

                while (GetNextMember(out var memberName))
                {
                    var field = componentType.GetField(memberName,
                                                       BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
                    if (field != null)
                    {
                        var currentValue = field.GetValue(component);
                        UpdateMemberValue(ref currentValue);
                        field.SetValue(component, currentValue);
                    }
                    else
                    {
                        var property = componentType.GetProperty(memberName,
                                                                 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
                        if (property == null)
                        {
                            continue;
                        }

                        var currentValue = property.GetValue(component);
                        UpdateMemberValue(ref currentValue);
                        property.SetValue(component, currentValue);
                    }
                }
                FinishComponentLoad();
            }
            FinishObjectLoad();
        }
        private void SaveObject_internal(SaveObjectInfo targetObjectInfo)
        {
            /*
             * BeginComponentSave(nameof(GameObject)); // not realy a component but "its works"
             * {
             *  var obj = targetObjectInfo.GameObject;
             *
             *  GetNextMember("activeInHierarchy", obj.activeInHierarchy);
             *  GetNextMember("Tag",obj.tag);
             * }
             * FinishComponentSave();
             */

            foreach (var saveComponent in targetObjectInfo.GetComponents())
            {
                BeginComponentSave(saveComponent.GetType().Name);

                if (saveComponent.GetType() == typeof(Transform))
                {
                    var transform = saveComponent.transform;
                    AddMember("position", transform.localPosition);
                    AddMember("localScale", transform.localScale);
                    AddMember("eulerAngles", transform.localEulerAngles);
                }
                else
                {
                    foreach (var property in saveComponent.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
                    {
                        if (property.IsDefined(typeof(SaveAttribute)) && property.CanRead && property.CanWrite)
                        {
                            AddMember(property.Name, property.GetValue(saveComponent));
                            //Debug.Log($"property: {} value = {property.GetValue(saveComponent)}");
                        }
                    }

                    foreach (var field in saveComponent.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
                    {
                        if (field.IsDefined(typeof(SaveAttribute)) && !field.IsLiteral)
                        {
                            AddMember(field.Name, field.GetValue(saveComponent));
                            //Debug.Log($"field: {field.Name} value = {field.GetValue(saveComponent)}");
                        }
                    }
                }
                FinishComponentSave();
            }
        }