首页 > 其他分享 >8-2. 数据结构及坐标保存加载

8-2. 数据结构及坐标保存加载

时间:2024-02-29 10:34:07浏览次数:22  
标签:saveable void 加载 坐标 DataManager 数据结构 Data public saveableList

使用 ISaveable 标识可保存的数据

现在 C# 也像 Java 一样,接口可以写默认实现。大括号的写法和=>的写法是完全一致的

使用 DataManager 来统一管理所有数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class DataManager : MonoBehaviour
{
    public static DataManager instance;

    [Header("事件监听")]
    public VoidEventSO saveDataEvent;

    private List<ISaveable> saveableList = new List<ISaveable>();

    private Data saveData;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else
        {
            Destroy(gameObject);
        }

        saveData = new Data();
    }

    private void Update()
    {
        if (Keyboard.current.lKey.wasPressedThisFrame)
        {
            Load();
        }
    }

    private void OnEnable()
    {
        saveDataEvent.OnEventRaised += Save;
    }

    private void OnDisable()
    {
        saveDataEvent.OnEventRaised -= Save;
    }

    public void RegisterSaveData(ISaveable saveable)
    {
        if (!saveableList.Contains(saveable))
        {
            saveableList.Add(saveable);
        }
    }

    public void UnRegisterSaveData(ISaveable saveable)
    {
        saveableList.Remove(saveable);
    }

    public void Save()
    {
        foreach (var saveable in saveableList)
        {
            saveable.GetSaveData(saveData);
        }

        foreach (var item in saveData.characterPosDict)
        {
            Debug.Log($"item.Key = {item.Key}, item.Value = {item.Value}");
        }
    }

    public void Load()
    {
        foreach (var saveable in saveableList)
        {
            saveable.LoadData(saveData);
        }
    }
}

DataManager 使用了单例模式,确保场景中只有一个 DataManager

它里面有个存储结构 Data,Data 里面比较简单,只有一个 Dictionary

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Data
{
    public Dictionary<string, Vector3> characterPosDict = new Dictionary<string, Vector3>();
}

每个 ISaveable 在 enable 的时候,就会把自己添加到 DataManager.saveableList 里面;在 disable 的时候,就会把自己从 DataManager.saveableList 里面删掉

在 Update 里面,DataManager 监听了键盘上的 L 键,当 L 键按下的时候,就会遍历 saveableList,让所有物体回到它们之前记录的坐标

DataManager 监听了 SaveDataEvent,当 SaveDataEvent 产生的时候,DataManager 就会遍历 saveableList,把它们的位置记录下来,并打印一下

需要保存数据的对象继承 ISaveable

注意,每个待保存对象上面都有 DataDefination 组件,代码如下

OnValidate 在编辑器每次修改数据的时候调用一次,为 ID 进行赋值。这个 ID 也是 Data 存储时使用的 Key。

但是这样赋值之后,永远不会变了。我们可能有这样的需求,野猪预制体上面有个 ID,我往场景里添加了四个实例,我希望这四只野猪有不同的 ID,此时就能先把类型切换为 DoNotPersist,然后再切换为 ReadWrite,这样就能实现每只野猪有不同的 ID 了。

继承 ISaveable 的 GetSaveData 方法,就会让 DataManager 把当前物体的坐标记录到 Data 中,LoadData 方法就会让 DataManager 把物体的坐标还原成 Data 中记录的坐标

存储点通知 DataManager 存储数据

现在 DataManager 在监听 saveDataEvent 事件,这个事件由存储点发出

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240229_1008

标签:saveable,void,加载,坐标,DataManager,数据结构,Data,public,saveableList
From: https://www.cnblogs.com/hellozjf/p/18042884

相关文章

  • 数据结构与算法
    绪论数据结构的基本概念数据:是信息的载体,分整数型与非整数型数据数据项:构成数据元素的最小不可分割单位,如学生的成绩数据元素:数据的基本单位,作为一个整体存储,如每个学生的信息数据类型:具有相同性质的计算机数据的集合,以及在这个集合上的一系列操作,比如in......
  • 2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸
    2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系,"y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,"y上"表示这个道路的上限,给定一批长方形,每一个长方形有(x1,x2,y1,y2),4个坐标可以表示一个长方形,判断这条道路整体是不是可以走通的。以下为正式题目:图片在计算......
  • 7-4. 场景加载后的执行逻辑
    解决场景加载后人物坐标不正确的问题在SceneLoader.UnLoadPreviousScene中,场景卸载掉之后,需要将人物隐藏场景加载完之后,需要执行回调在回调中,需要设置当前加载的场景,设置人物的坐标,显示人物,并发布场景完成后的事件注意,afterSceneLoadedEvent是一个VoidEventSO切换场景......
  • Openlayer加载mapboxgl矢量图层
    注意Openlayer的版本Openlayer是支持直接加载矢量图层的,如下图层会没有样式渲染<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0&q......
  • 数据结构【线段树】
    对于一个数据结构而言,我们总要能对其进行两件事:修改和操作。操作在这里是一个专有名词,专门指代求最值、求和等操作,具体能指代什么操作之后再聊。 如果朴素的用数组进行存储,那么修改是O(1)的,而操作往往是O(n)的。当操作指的是求和的时候,我们可以使用前缀和算法,前缀和使得操作是O(......
  • C# 简单反射加载 DLL 实例
    //反射判断是否位某个类型publicboolIsSubclassOf(thisTypetype,TypebaseType){//如果type不是null并且baseType是一个类(非接口)if(type!=null&&baseType.IsClass){returntype.IsSubclassOf(baseType);}//或者如果baseType是......
  • Qt 常见数据结构详解:从基本框架到实际应用
    在Qt框架中,数据结构的选择对于提高代码效率和性能至关重要。正确地使用数据结构可以显著提高应用程序的效率和响应速度。下面我们将详细介绍Qt中常见的几种数据结构,包括QString、QList、QVector、QMap、QHash、QSet和QPair。1.QStringQString是Qt中用于处理字符串的类。......
  • 算法入门:数据结构
    文章目录1.什么是算法和数据结构2.算法2.1.算法的特性2.2.算法设计的要求3.数据结构3.1.数组3.1.1.数组的定义3.1.2.数组的基本特性3.1.3.多维数组3.1.4.数组的同质性3.1.5.动态数组3.1.6.数组的优缺点3.1.7.数组的应用场景3.1.8.结论3.2.链表3.2.1.链表的定义......
  • react 使用splitChunks 拆分组件,缩小项目体积,加快加载访问速度
    react编写项目引入npm包打包时,总会将一些npm包重复打包的不同的js文件中,可以使用splitChunks进行拆分,降低体积,加快速度1、安装npminstallcustomize-crawebpack-bundle-analyzer2、修改启动命令,在package.json中修改"scripts":{"start":"react-app-rewiredstar......
  • uni-app分包优化、页面预加载、页面跳转等封装
    uni-app分包优化、页面预加载、页面跳转等封装:https://blog.csdn.net/qq_44209274/article/details/115913680?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170900569616800192290740%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=1......