Unity2D:人物数值及场景的保存加载

一、在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);

       }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值