返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 1475|回复: 0

[转载] 【转载】Unity常见的三种数据本地持久化方案

[复制链接]
发表于 2025-2-19 10:09:56 | 显示全部楼层 |阅读模式
Unity常见的三种数据本地持久化方案
转载作者:VisionWong

做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件。

一. PlayerPrefs
这是Unity自带的解决方案,会自动生成文件存储于本地,API简单,封装了繁琐的序列化反序列化过程,但他只支持几种基本数据类型,string、int、float,比较简单的数据存读取功能的话,用这个会比较方便。
示例:
早前做历史最高分数的功能,只用到了Get和Set便能实现,Get的第二个参数表示没有取到的默认值。

    //记录分数
    PlayerPrefs.SetInt("lastScore", GameUIController.Instance.score);
    PlayerPrefs.SetInt("lastLength", GameUIController.Instance.bodyLength);
    if (PlayerPrefs.GetInt("bestScore", 0) < GameUIController.Instance.score)
    {
        PlayerPrefs.SetInt("bestScore", GameUIController.Instance.score);
        PlayerPrefs.SetInt("bestLength", GameUIController.Instance.bodyLength);
    }        

API非常简单,Get和Set会用就掌握大半了:




二. Json(Newtonsoft)
Json的话就可以存储复杂一点的对象,从而实现游戏的存读档。提供一个Json的格式化校验网址:链接
示例:
这里用到的是Newtonsoft的API,需要下载ddl(官网链接),将下载的包放入Assets任意子目录下,通过引入命名空间 using Newtonsoft.Json; 即可使用
以下为早前通过Json文档读取UI界面类型的简单案例:


[
{"panelType":"MainMenu",
"path":"UIPanels/MainMenuPanel"},

{"panelType":"Battle",
"path":"UIPanels/BattlePanel"},

{"panelType":"Skill",
"path":"UIPanels/SkillPanel"},

{"panelType":"Knapsack",
"path":"UIPanels/KnapsackPanel"},

{"panelType":"Setting",
"path":"UIPanels/SettingPanel"},

{"panelType":"Task",
"path":"UIPanels/TaskPanel"}
]


    /// <summary>
    /// 解析UI界面Json文档
    /// </summary>
    private void ParseUIPanelJson()
    {
        panelPathDict = new Dictionary<UIPanelType, string>();
        //首先读取Resources文件夹下的Json文档
        TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
        //解析Json文档,用这个库的好处就是能直接反序列化成对象列表,操作简便
        List<UIPanelInfo> infoList = JsonConvert.DeserializeObject<List<UIPanelInfo>>(ta.text);
        //存入字典保存
        foreach (var info in infoList)
        {
            panelPathDict.Add(info.panelType, info.path);           
        }
    }



三. XML
XML一样可以存储复杂数据对象,相较于Json优点是可读性良好,但效率较低,适合大量的数据配置
第一步要先写XML模板文件,一个怪物的配置模板示例:(必须写两个一样的结点Excel才能映射)


<?xml version="1.0" encoding="UTF-8"?>
<root>
        <item ID="">
                <mName></mName>
                <resPath></resPath>
                <hp></hp>
                <ad></ad>
                <ap></ap>
                <addef></addef>
                <apdef></apdef>
                <dodge></dodge>
                <pierce></pierce>
                <critical></critical>
        </item>
        <item ID="">
                <mName></mName>
                <resPath></resPath>
                <hp></hp>
                <ad></ad>
                <ap></ap>
                <addef></addef>
                <apdef></apdef>
                <dodge></dodge>
                <pierce></pierce>
                <critical></critical>               
        </item>
</root>


第二步:
1、将模板文件导入Excel(只能是微软Excel,WPS没有此功能,如无法使用微软Excel,请自行编辑XML文件)在Excel中打开自定义菜单:文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项卡。
2、在开发工具面板里:XML-源-XML映射-添加模版文件
3、选中源面板里的模版,映射到表格里。
4、在Excel中填充数据数据所有类型,最终都会转化为字符串类型
5、从Excel中导出附带数据的xml文件在开发工具面板里:XML-导出
填充数据后的Excel表格示例:




第三步:
将XML文件存放至Assets\StreamingAssets目录下(StreamingAssets第一次需要自行创建文件夹)

第四步:
使用脚本加载XML文件

    public TextAsset TestXMLAsset;

    public XmlDocument TestXMLDocument;

    public XmlNodeList TestXMLNodeList;


    public void Start()
    {
        //加载物品信息XML
        string TestXMLPath = Path.Combine(Application.streamingAssetsPath, "XMLMain/test.xml");

        if (!File.Exists(TestXMLPath))
        {
            print("文件不存在:" + TestXMLPath);
        }
        else
        {
            print("文件存在:" + TestXMLPath);

            TestXMLDocument = new XmlDocument();

            //读取物品信息XML
            TestXMLDocument.Load(TestXMLPath);
            //解析获取XML的Tag为列表
            TestXMLNodeList = TestXMLDocument.GetElementsByTagName("resPath");
            //从XmlElement里获取名称为"resPath"的数据
            print("XML读取第1个物品图片资源信息" + TestXMLNodeList[0].InnerText);
        }

    }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表