public static void Save(object obj)
        {
            if (obj == null)
            {
                return;
            }

            Type type = obj.GetType();

            while (type != null)
            {
                FieldInfo[] fieldInfos = type.GetFields(bindingFlags);
                type = type.BaseType;

                foreach (FieldInfo fieldInfo in fieldInfos)
                {
                    StoragePlayerPrefsAttribute attribute = fieldInfo.GetCustomAttribute(typeof(StoragePlayerPrefsAttribute), false) as StoragePlayerPrefsAttribute;

                    if (attribute == null)
                    {
                        continue;
                    }

                    var value   = fieldInfo.GetValue(obj);
                    var nameVar = attribute.NameStoredVar;

                    if (fieldInfo.FieldType == typeof(string))
                    {
                        PlayerPrefs.SetString(nameVar, (string)value);
                    }
                    else if (fieldInfo.FieldType == typeof(bool))
                    {
                        int auxInteger = System.Convert.ToInt32(value);
                        PlayerPrefs.SetInt(nameVar, auxInteger);
                    }
                    else if (fieldInfo.FieldType == typeof(float))
                    {
                        PlayerPrefs.SetFloat(nameVar, (float)value);
                    }
                    else if (ConvertExtend.TryConvertTo <int>(value, out int auxInteger))
                    {
                        PlayerPrefs.SetInt(nameVar, auxInteger);
                    }
                    else
                    {
                        LogManager.LogError("You can't save this var");
                    }
                }
            }

            PlayerPrefs.Save();
        }
        public static void Load(object obj)
        {
            if (obj == null)
            {
                return;
            }

            Type type = obj.GetType();

            while (type != null)
            {
                MemberInfo[] membersInfo = type.GetMembers(bindingFlags);
                type = type.BaseType;

                foreach (MemberInfo memberInfo in membersInfo)
                {
                    StoragePlayerPrefsAttribute attribute = memberInfo.GetCustomAttribute(typeof(StoragePlayerPrefsAttribute), false) as StoragePlayerPrefsAttribute;

                    if (attribute == null)
                    {
                        continue;
                    }

                    var value   = memberInfo.GetValue(obj);
                    var nameVar = attribute.NameStoredVar;

                    if (memberInfo.ValueType() == typeof(string))
                    {
                        PlayerPrefsExtend.LoadString(nameVar, (string)value, new MemberComplexInfo(memberInfo, obj));
                    }
                    else if (memberInfo.ValueType() == typeof(bool))
                    {
                        PlayerPrefsExtend.LoadBool(nameVar, (bool)value, new MemberComplexInfo(memberInfo, obj));
                    }
                    else if (memberInfo.ValueType() == typeof(float))
                    {
                        PlayerPrefsExtend.LoadFloat(nameVar, (float)value, new MemberComplexInfo(memberInfo, obj));
                    }
                    else if (ConvertExtend.TryConvertTo <int>(value, out int auxInteger))
                    {
                        PlayerPrefsExtend.LoadInt(nameVar, auxInteger, new MemberComplexInfo(memberInfo, obj));
                    }
                    else
                    {
                        LogManager.LogWarning("You can't load this var");
                    }
                }
            }
        }