数据存储 PlayerPrefs XML JSON

数据的持久化存储

这个简单的来讲就是一个存档的功能 如果没有这个,游戏一关,电源一拔 立马傻眼 O(∩_∩)O 但也有这样的游戏,比如一些小游戏

硬盘   大 目前一般都是买 T        固态硬盘   机械硬盘 机械硬盘分转速7200转 5400转的 转速越高 写入和读取的速度越快
内存   比硬盘小  现在一般是G级别 读取速度比硬盘快
CPU缓存(一级内存,二级内存) 基本上10兆以内 读写速度最快的 存储一些最核心 每天都要用的数据 
我们写的这些代码都放在内存里了,持久化存储 需要把数据放在硬盘里 
因为如果不放在硬盘里程序结束运行 这块内存就会被释放掉 
单机游戏 一般这么做   
网络游戏 一般都放在服务器里 
缺点占用自己内存空间 不太安全 比如 找到那个文件打开改改数据这些 除非做加密处理


云端服务器  可插拔的电脑

PlayerPrefs 内置的存储类

unity内置的 存储一些简单的 存储到本地 Float Int String

存储路径分系统大不相同 Windows存储在注册表里

using UnityEngine;

public class PlayerPrefs : MonoBehaviour {
    private void Start(){
        //****************存储****************
        //不需要实例化 
        //存储到本地
        PlayerPrefs.SetFloat("Score",99.9f);
        //注意:这里如果换一个方法 存同名的会被覆盖
        PlayerPrefs.SetString("Score","100分");
        //****************读取****************
        float value = PlayerPrefs.GetFloat("Score");
        Debug.Log(value);
    }
}

XML

树形结构

标签对


<头标签>
    这中间是他的值
</尾标签>

<头标签>		 <----- 他到头了 可以叫根元素 他底下的都叫子元素
    <字标签>
        这中间是字标签的值
    </字标签尾>
</尾标签>

<头标签 name="Cube">    <----- 这个是他的属性
    这中间是他的值
</尾标签>

小例子 存储组件

<?xml version="1.0" encoding="UTF-8"?>  <------头文本文件
	  版本号		  编码格式

<GameObject name="Cube",tag="Player"> <!--这个是注释  第一个子节点-->
    <Transform>
    	<position>
            <x>1</x>
            <y>2</y>
            <z>3</z>
        </position>
        <rotation/>
        <scale/>
    </Transform>
	<BoxCollider>
    </BoxCollider>
</GameObject>

用代码去生成XML

using UnityEngine;
using System.Xml;//引用命名空间

public class XmlGenerate : MonoBehaviour {
    //创建文档对象
    XmlDocument doc = new XmlDocument();  //相当于在内存里创建了一个空白的XML文档 还没有存到本地
    
    //创建头文本节点
    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0","UTF-8",null);
    //现在只是创建了头文本节点,需要加入到文档里,不然文档里还是空的
    //将头文本节点放置在文档中
    doc.AppendChild(dec);
    
    //创建根元素节点
    //一个文档里不能有多个根节点
    XmlElement pos_Element = doc.CreateElement("Position");
    
    //创建属性 给根元素添加
    pos_Element.SetAttribute("name",gameObject.name);
    
    //暂时存储一下
    string pos = transform.position.ToString();
    //去掉括号 
    //原先内容里是<Position>(11.0,22.0,33.0)</Position>
    //这里先从后面删除 这样不改变长度 然后再删第一个
    pos = pos.Remove(pos.Length - 1).Remove(0,1);
    //给根元素节点设置值
    pos_Element.InnerText = pos;
    //根元素节点添加到文档中,跟上面一样
    doc.AppendChild(pos_Element);
    
    //到此为止都是存在内存里的
    //存到本地 当前工程下的Assets文件夹
    doc.Save(Application.dataPath + "/Demo.xml");
}

用代码解析XML

using UnityEngine;
using System.Xml;//引用命名空间

public class XMLParse : MonoBehaviour {
    
    private void Start(){
        //创建一个文档对象
        XmlDocument doc = new XmlDocument();
        //加载XML到文档里
        doc.Load(Application.dataPath + "/Demo.xml");
        //解析XML
        //拿到他的第一个子节点
        XMLDeclaration node = doc.FirstChild as XMLDeclaration;
    }
}

JSON

只能有有一个根元素

键值对

大括号里必须存一对一对的 必须是个整体 有Key 有Value

有key放大括号里

没有key放中括号里

这里边使用的是LitJson.dll 第三方的库

使用需要先创建一个Plugins文件夹 然后把第三方库粘贴到里面

unity 提前编译的三个文件夹 Standard Assets Plugins Editor

{
    "LevelMsg":[
        {
            "LevelIndex":1,
            "LevelStars":3
        },
        {
            "LevelIndex":2,
            "LevelStars":2
        }
	]
}

写完后 可以做一个语法鉴定 防止翻车 百度搜Json在线解析 或者直接输入网址 json.cn

解析

using UnityEngine;
using LitJson;//引用命名空间


//为了方便理解这里用的中文,正规的key还是英文比较好  以类的方式进行封装解析
//Json 里不认float  只认double
//解析时候没事 生成的话会报错

[System.Serializable]//使用JsonUtility.FromJson要先序列化
public class Hero{
    public string 英雄名称;
    public double 生命值;
    public double 攻击力;
    public Skill[] 技能;
}

[System.Serializable]
public class Skill{
    public string 技能名称;
    public int[] 技能冷却;   //封装到unity可以描述的时候就不用在封装了
}


public class JsonParse : MonoBehaviour {
    
    private String json = 
        "这里粘贴那一大串json vs有的版本直接在前面加一个@符号就能自动转义 如果不能转义的可以在百度搜索字符串转义工具就有了";
    
	private void Start(){
        //解析Json
		JsonData data = JsonMapper.ToObject(json);
        //非泛型/通用型解析
        Debug.Log(data["技能"][0]["技能名称"]);
        //泛型/指定结构解析
        Hero hero = JsonMapper.ToObject<Hero>(json);
        Debug.Log(hero.英雄名称);
        Debug.Log(hero.技能[0].技能名称);
        //也可以转成json
        string jsonData = JsonMapper.ToJson(hero);
        Debug.Log(jsonData);
        
        //unity 也提供了json解析
		hero = JsonUtility.FromJson<Hero>(json);
        
	}
}

<think>嗯,用户之前问了关于Unity中JSON数据的存储路径,现在他们问如何清空PlayerPrefs里的JSON数据。首先,我需要确认他们是否真的在使用PlayerPrefs来存储JSON数据。因为通常PlayerPrefs是用来保存简单的键值对,比如整数、字符串或浮点数,而JSON数据通常是结构化的数据,可能被序列化成字符串后存入PlayerPrefs。 用户可能遇到了数据管理的问题,想要清除存储在PlayerPrefs中的某个特定JSON数据或者所有数据。需要解释清楚PlayerPrefs的基本操作,比如删除单个键、所有键,以及需要注意的事项。可能他们误以为PlayerPrefs里的数据是以文件形式存在的JSON,但实际上PlayerPrefs在Windows下是注册表,其他平台可能不同,比如Android使用SharedPreferences,iOS使用NSUserDefaults。 用户可能不太清楚如何正确清理PlayerPrefs,或者担心删除后会不会影响其他数据。需要详细说明PlayerPrefs.DeleteKeyPlayerPrefs.DeleteAll的区别,以及DeleteAll会删除所有数据,而不仅仅是某个键。还要提醒他们在删除之前保存数据,避免误删重要信息。 另外,可能用户在使用PlayerPrefs存储JSON时遇到了版本兼容性或数据冲突的问题,比如更新游戏后旧数据导致的问题,所以需要清除。这时候建议他们考虑使用更可靠的数据存储方式,比如文件系统(Application.persistentDataPath),因为PlayerPrefs不适合存储大量或复杂的数据。 最后,要确保回答清晰,步骤明确,并提供代码示例,方便用户直接使用。同时注意提醒他们在实际操作中的注意事项,比如编辑器中的测试和不同平台的行为差异。</think>在 Unity 中,`PlayerPrefs` 是用于存储简单键值对(如整数、字符串、浮点数)的轻量级持久化工具。如果你将 JSON 数据以字符串形式存储到 `PlayerPrefs` 中,可以通过以下方式清空数据: --- ### **1. 清空单个键值** 如果 JSON 数据存储在 **特定键名**(如 `"PlayerData"`)下: ```csharp // 删除指定键值 PlayerPrefs.DeleteKey("PlayerData"); PlayerPrefs.Save(); // 立即保存更改(部分平台需手动调用) ``` --- ### **2. 清空所有 PlayerPrefs 数据** 若需完全清空 `PlayerPrefs` 中存储的所有数据(慎用!会删除全部键值): ```csharp PlayerPrefs.DeleteAll(); // 删除所有数据 PlayerPrefs.Save(); // 确保更改生效 ``` --- ### **注意事项** 1. **平台差异**: - Windows:数据存储在注册表中(路径如 `HKCU\Software\[公司名]\[项目名]`)。 - Android:数据存储在 `/data/data/<包名>/shared_prefs/` 的 XML 文件中。 - iOS:数据存储在 `NSUserDefaults` 中。 2. **测试时清空数据**: - 在编辑器中测试时,可直接通过菜单操作清空: **Edit > Project Settings > Player > Delete All PlayerPrefs** ![Unity Editor 清空 PlayerPrefs](https://docs.unity3d.com/uploads/Main/PlayerPrefsDeleteAll.png) 3. **数据安全**: - `PlayerPrefs` **不适合存储敏感数据**(如密码),因为数据未加密。 - 若存储 JSON 等复杂数据,建议改用 `Application.persistentDataPath` + 文件读写(更灵活且可控)。 --- ### **替代方案:JSON 文件存储** 如果频繁需要清空或管理 JSON 数据,建议改用文件系统(如 `Application.persistentDataPath`): ```csharp using System.IO; // 清空 JSON 文件 string path = Path.Combine(Application.persistentDataPath, "data.json"); if (File.Exists(path)) { File.Delete(path); } ``` --- ### **总结** - 若 JSON 数据通过 `PlayerPrefs` 存储: - 用 `DeleteKey("键名")` 删除特定数据。 - 用 `DeleteAll()` 清空全部数据(谨慎使用)。 - 更推荐将 JSON 存储在文件中(`Application.persistentDataPath`),便于管理和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值