一、在Data中(保存的数据类)用于存储数据,用字典方法(Dictionary<TKey,TValue>)匹配对应物体的值
float值可以是人物的血量、power等
public Dictionary<string,Vector3> characterPosDict = new Dictionary<string, Vector3>();
//角色的血量、power等
public Dictionary<string,float> floatSavedData = new Dictionary<string,float>();
二、保存数值
public void GetSaveData(Data data)
{
if(data.characterPosDict.ContainsKey(GetDataID().ID))
{
data.characterPosDict[GetDataID().ID] = transform.position;
//更新 2
data.floatSavedData[GetDataID().ID + "health" ] = this.currrntHP;
data.floatSavedData[GetDataID().ID + "power"] = this.currrntPower;
}else
{
data.characterPosDict.Add(GetDataID().ID,transform.position);
//添加 1
data.floatSavedData.Add(GetDataID().ID + "health" ,this.currrntHP);
data.floatSavedData.Add(GetDataID().ID + "power" ,this.currrntPower);
}
}
public void LoadeData(Data data)
{
if(data.characterPosDict.ContainsKey(GetDataID().ID))
{
transform.position = data.characterPosDict[GetDataID().ID];
//读取 3
this.currrntHP = data.floatSavedData[GetDataID().ID + "health" ];
this.currrntPower = data.floatSavedData[GetDataID().ID + "power"] ;
//通知UI更新
OnHealthyChange?.Invoke(this);
}
}
三、保存场景
在SceneLoader中添加接口
public class SceneLoader : MonoBehaviour,ISaveable
在OnEnable和OnDisable中注册和注销
private void OnEnable()
{
loadEventSO.LoadRequestEvent += OnLoadRequestEvent;//注册事件
newGameEvent.OnEventRaised += NewGame;
//场景注册
ISaveable saveable = this;
saveable.RegisterSaveData();
}
private void OnDisable()
{
loadEventSO.LoadRequestEvent -= OnLoadRequestEvent;
newGameEvent.OnEventRaised -= NewGame;
//场景卸载
ISaveable saveable = this;
saveable.UnRegisterSaveData();
}
得到ID,在Unity中选择SceneLoad Manager挂载DataDefinition 生成GUID
public DataDefinition GetDataID()
{
//生成获得场景ID
return GetComponent<DataDefinition>();
}
保存当前场景数据(currentLoadScene),保存时的名字
public class Data
{
//保存场景
public string sceneToSave;
//坐标
public Dictionary<string,Vector3> characterPosDict = new Dictionary<string, Vector3>();
//角色的血量、power等
public Dictionary<string,float> floatSavedData = new Dictionary<string,float>();
将GameSceneSO文件转化为string (工厂模式)
public void SaveGameScene(GameSceneSO savedScene)
{
//JsonUtility可以将object类型转化为string类型
sceneToSave = JsonUtility.ToJson(savedScene);
}
通知工厂
public void GetSaveData(Data data)
{
data.SaveGameScene(currentLoadScene);
}
通过player的ID,判断相关数据是否保存
将string类型数据反序列化
public GameSceneSO GetSavedScene()
{
var newScene = ScriptableObject.CreateInstance<GameSceneSO>();
JsonUtility.FromJsonOverwrite(sceneToSave , newScene);//覆盖场景
return newScene;
}
读取场景
public void LoadeData(Data data)
{
var playerID = playerTrans.GetComponent<DataDefinition>().ID;
if(data.characterPosDict.ContainsKey(playerID))
{
positionToGo = data.characterPosDict[playerID];//与Character中保存的坐标一致
sceneToLoad = data.GetSavedScene();
OnLoadRequestEvent(sceneToLoad , positionToGo , true);
}