using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SaveDataManager<T> //要跟踪处理所有类,所以必然是个泛型类
{
Type inputType; //既然要反射,那当然先申明一个Type
FieldInfo[] fieldInfos;
T inputObject;
string keyName;//单个存储名
void SaveObject()
{
PlayerPrefs.SetInt("Var Numbers", fieldInfos.Length);//存数组数量
for (int i = 0; i < fieldInfos.Length; i++)//浏览fieldInfos数组存储
{
//inputType.Name是类名
//fieldInfos[i].Name是变量名
//fieldInfos[i].FieldType得到变量类型
//fieldInfos[i].GetValue(inputObject) 将得到传进来的东西的这里面的变量是什么
//Convert.ToInt32等强转object
#region 基本变量存档
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(int)))
{
PlayerPrefs.SetInt(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name,
Convert.ToInt32(fieldInfos[i].GetValue(inputObject)));
}
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(float)))
{
PlayerPrefs.SetFloat(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name,
Convert.ToSingle(fieldInfos[i].GetValue(inputObject)));
}
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(string)))
{
PlayerPrefs.SetString(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name,
Convert.ToString(fieldInfos[i].GetValue(inputObject)));
}
#endregion
}
}
void LoadObject(string keyName, T value) //传一个类名同时传一个key名来读取
{
inputObject = value;//传进来存起来
inputType = value.GetType();//我们要得到他的类型
//然后得到所有公共变量数组
fieldInfos = inputType.GetFields();
int varNum = PlayerPrefs.GetInt("Var Numbers");//读数组数量
object loadObj = Activator.CreateInstance(inputType);//快速构造一个这个类的object变量,类似于new一个
for (int i = 0; i < varNum; i++)//基于要读档的类里面的变量类型进行读取
{
FieldInfo nowVar = inputType.GetField(fieldInfos[i].Name);//得到名字对应新建变量(object)
#region 基本变量读档
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(int)))
nowVar.SetValue(loadObj, PlayerPrefs.GetInt(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name));
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(float)))
nowVar.SetValue(loadObj, PlayerPrefs.GetFloat(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name));
if (fieldInfos[i].FieldType.IsAssignableFrom(typeof(string)))
nowVar.SetValue(loadObj, PlayerPrefs.GetString(keyName + "_" + inputType.Name + "_" + fieldInfos[i].Name));
#endregion
}
}
}