【Unity实战教程】unity用json存档和读档武器属性

前言

  1. 本内容为本人原创提供
  2. 本内特为学习者提供原创完整的工程源码下载,可参考学习或其他用途。
  3. 本内容从武器相关属性出发,对数据存取操作,一步一步推进,能直观感受。
  4. 如果后续有其他的存取游戏数据的方式,将继续提供给大家借鉴参考,希望能协助大家完成自己项目。

目录

前言

一、什么是json

二、json全认识

    1、键和值    

    2、{ } 中的对象

    3、[ ] 数组

    4、两种不同结构写法       

    5、注意事项

三、unity实战

1、起始工作

        1.1、unity对json操作的准备工作

        1.2、c#对操作的起始工作

        1.3、玩家属性:

2、创建json文件

3、保存的json数据

4、读取json数据

 五、运行图示

 六、总结

写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。

七、下载


一、什么是json

     JSON是数据交换格式,于2000年被定义出基本语法和数据结构模式,13年后正式定义了JSON的数据交换格式,详细描述了JSON的语法和结构。它用于服务器与网络应用程序,具有较高的传输效率,使得其广泛运用。


二、json全认识

        先上一段 json 数据结构

{
    "weapon_list": [
        {
            "weapon_id": "00001",
            "weapon_lv": "1",
            "weapon_name": "伏魔剑",
            "weapon_atc": 30,
            "weapon_def": 1,
            "weapon_money": 100,
            "weapon_skillidlist": [
                {
                    "skil_id1": "00001",
                    "skil_id2": "00003",
                    "skil_id3": ""
                }
            ]
        },
        {
            "weapon_id": "00002",
            "weapon_lv": "1",
            "weapon_name": "令月剑",
            "weapon_atc": 55,
            "weapon_def": 1,
            "weapon_money": 500,
            "weapon_skillidlist": [
                {
                    "skil_id1": "00001",
                    "skil_id2": "",
                    "skil_id3": ""
                }
            ]
        },
        {
            "weapon_id": "00003",
            "weapon_lv": "1",
            "weapon_name": "云征剑",
            "weapon_atc": 75,
            "weapon_def": 1,
            "weapon_money": 800,
            "weapon_skillidlist": [
                {
                    "skil_id1": "00002",
                    "skil_id2": "00005",
                    "skil_id3": ""
                }
            ]
        },
        {
            "weapon_id": "00004",
            "weapon_lv": "1",
            "weapon_name": "木舞剑",
            "weapon_atc": 125,
            "weapon_def": 1,
            "weapon_money": 1700,
            "weapon_skillidlist": [
                {
                    "skil_id1": "00003",
                    "skil_id2": "00004",
                    "skil_id3": "00005"
                }
            ]
        },
        {
            "weapon_id": "00005",
            "weapon_lv": "1",
            "weapon_name": "蟲羽剑",
            "weapon_atc": 150,
            "weapon_def": 1,
            "weapon_money": 2100,
            "weapon_skillidlist": [
                {
                    "skil_id1": "00001",
                    "skil_id2": "00007",
                    "skil_id3": ""
                }
            ]
        }
    ]
}
    1、键和值    

        “xxx”“yyy”    左边是一条键值

  •     “xxx”是“键”,“yyy”是“值”,其中有“”分开,
  •     是分隔下一对键值的符号,但是如果是最后一行键值,不用该符号。       
    2、{ } 中的对象

        { } 是包括对象的符号,其中可以放键值,或者数组,值之间用逗号“,”分隔。

    3、[ ] 数组

        由单个或者多个键值或者数组组合,用方括号 [ ] 包围,值之间用逗号“,”分隔。

    4、两种不同结构写法       
      "weapon_skillidlist": [
        {
          "skil_id1": "00001",
          "skil_id2": "",
          "skil_id3": ""
        }
      ]
      "weapon_skillidlist": 
        [
           {
               "skil_id1": "00001",
           },
           {
               "skil_id2": "",
           },
           {
               "skil_id3": ""
           },
        ]

     根据自己喜好或者眼缘选一个,这里我们就选第一个了。

    5、注意事项
  •     初学json数据格式会比较晕,这里推荐一个检测json文本是否合格的网站 json格式检测网址
  •     另外json数据中的空格是被忽略的。
  •     最后,json文档是以.json为后缀。

三、unity实战

        本次实战采用武器属性单元展开,对武器属性进行存档和读档操作。

1、起始工作
        1.1、unity对json操作的准备工作

        我们采用 Newtonsoft.Json 组件对json进行数据操作,需要导入该组件。Newtonsoft.Json 也是.net开发中常用的网络数据解析dll,效率高,所以选它了。

        导入之后,文件夹情况是这样

        1.2、c#对操作的起始工作

        解析json需要引用

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

        对文件操作引用

using System.IO;
        1.3、玩家属性:

          首先,把武器内容属性规范好,可以创建武器结构体,或者类。如果数据多,并且比较复杂,可以选择类,我这里选择创建一个武器类

public class Weapon
{
    public int weapon_id { get; set; }
    public int weapon_lv { get; set; }
    public string weapon_name { get; set; }
    public int weapon_atc { get; set; }
    public int weapon_def { get; set; }

    public int weapon_money { get; set; }


    public List<WeaponSkill> weapon_skillidlist { get; set; }
}

        补充一个知识点:如果是用 JsonUtility 操作 json 数据 那就不要用 get set 方法,否则读取不到数据

注意:第一个 { } 是根对象,我们需要再建一个类,将所有武器类都装进去

public class JsonRoot
{
    public List<Weapon> weapon_list { get; set; }
}

weapon_list  是json文件中的根对象,这里和jsonroot中的变量对象名称必须保持一样。否则会报错:

ArgumentNullException: Value cannot be null.

 同时把 weapon_skillidlist 创建出来

public class WeaponSkill
{
    public string skil_id1 { get; set; }
    public string skil_id2 { get; set; }
    public string skil_id3 { get; set; }
}

        这里是一个一个装有技能 ID 的类,如果设计了技能系统,可以根据这些变量值去解析对应的技能。当然,我们这课是没有技能系统,只声明了一个技能名称作为展示。

        最终,我们创建了三层结构,JsonRoot 里面的 weapon_list 对应json根对象,Weapon 作为json主要的对象,weapon_skillidlist 则是对应最后一个 WeaponSkill 里的对象。

        注意,这三个类的变量名与json里面的键对象名称都是一致。


2、创建json文件

        json文件数据结构比较复杂,我们采用备份原始数据,再复制一份可以随时修改和保存的文件。

        2.1、创建文件路径

    private string jsonsourcePath = Application.dataPath + "/Save/basic/gameJson(备份勿删).json";
    private string jsonPathDestination = Application.dataPath + "/Save";
    private string jsonPath = Application.dataPath + "/Save/gameJson.json";

        2.2、创建文件

    //序创建一个Json表,将默认文件拷贝到或者覆盖
    public void CreateJsonDoc()
    {
        string newFileName = "gameJson.json"; // 新文件名
        // 目标文件的完整路径
        string jsdestinPath= Path.Combine(jsonPathDestination, newFileName);
        // 复制文件到新路径,并重命名
        File.Copy(jsonsourcePath, jsdestinPath, true); // true 表示如果目标文件存在,则覆盖它      
    }

        由 jsonsourcePath 路径下的文件复制并覆盖到 jsonPathDestination 下,这个新文件的名字叫做 "gameJson.json"。

        其实是把 jsonPath 文件覆盖了,而这个文件就是我们要存和取的文件。


3、保存的json数据
 StreamReader reader = new StreamReader(jsonPath, Encoding.UTF8);

         读取文件流

    public void SaveJsonDoc()
    {
        if (Gamemanager.Instance.weaponList.Count <= 0)
            return;

        string str = JsonConvert.SerializeObject(Gamemanager.Instance.jsonRoot, Formatting.Indented);
        File.WriteAllText(jsonPath, str);
    }
}

        我们只需要对 JsonRoot 类中的 weapon_list 变量进行序列化,那么就可以转为一串字符进而保存 json 了。

        weapon_list 里面的值都是读取而来。


 4、读取json数据
    public void ReadJsonDoc()
    {
        StreamReader reader = new StreamReader(jsonPath, Encoding.UTF8);
        string jsonContent = reader.ReadToEnd();
        Gamemanager.Instance.jsonRoot = new JsonRoot();
        Gamemanager.Instance.jsonRoot = JsonConvert.DeserializeObject<JsonRoot>(jsonContent);
        Gamemanager.Instance.weaponList = new List<Weapon>(Gamemanager.Instance.jsonRoot.weapon_list);
        reader.Close();
        reader.Dispose();
    }

         DeserializeObject流文件后,记得关闭释放,不然会其他操作报错

IOException: Sharing violation on path C:\pro\My project (2)\Assets\Save\gameJson.json    

        取出文件流,由 DeserializeObject<JsonRoot>  反序列并赋值给 JsonRoot 类中的 weapon_list。

        只要读到一个根对象,就能得到全部json数据,就这么简单。

        只要类的变量名和json中的对象(键)名称保持一致,基本上就保证成功了。


 五、运行图示


 六、总结

  •    json数据结构中,注意每个同级别键值的最后一条键值不需要加“ , ”。
  •    解析的类中的变量名一定要与数据结构中的对象(键)名一致。
  •    游戏是复杂的数据结构,做好类结构,变量结构,争取只用一个类读取全部的json数     据。
  •    清晰的类与数据结构,能在做游戏数据时不会干扰到自己的开发。
  •    如果有问题,去检测数据结构的网址看看。
写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。

七、下载

【unity实战案例】json存取工程下载

<think>好的,我现在需要帮助用户了解如何在Unity中解析生成JSON数据。根据用户提供的引用内容,我需要整理出不同的方法,并比较它们的优缺点,确保回答结构清晰,符合用户的要求。 首先,用户提到了四个引用,分别涉及Unity自带的JsonUtility、LitJson、Newtonsoft.Json以及一些实战例子。我需要将这些方法分门别类,逐一说明使用步骤注意事项。 用户可能是一个Unity开发者,需要处理JSON数据,比如保存游戏配置、存档或者与服务器通信。他们可能对JSON的基本概念有所了解,但更关心在Unity中的具体实现方法。此外,用户可能对性能、易用性处理复杂数据结构的能力有需求,所以需要比较不同工具的优缺点。 接下来,我需要考虑如何组织回答。根据示例,应该先介绍不同的方法,然后给出示例代码,再比较优缺点,最后总结应用场景注意事项。同时,用户要求生成相关问题,这部分需要放在最后。 首先,解析JSON的方法有四种:JsonUtility、LitJson、Newtonsoft.JsonUnityWebRequest结合其他工具。生成JSON的方法类似,但需要注意数据结构是否支持。 对于JsonUtility,需要强调它是Unity自带的工具,但只能处理简单结构可序列化的类,可能无法处理字典或复杂嵌套。LitJson则支持更多类型,比如字典,但需要导入dll。Newtonsoft.Json功能强大,但需要额外导入,可能增加项目体积。UnityWebRequest通常用于从网络或本地获取JSON数据,再结合其他工具解析。 在代码示例部分,需要分别展示每种方法的解析生成步骤。例如,使用JsonUtility解析时,必须创建带有[Serializable]标记的类,而LitJson可以直接使用JsonData来处理动态结构。 然后,优缺点对比要简明扼要,指出每种方法的适用场景。比如,简单数据用JsonUtility,复杂结构用LitJson或Newtonsoft.Json。 注意事项部分要提醒用户类结构匹配、性能问题、跨平台兼容性以及数据安全,比如处理外部JSON时验证数据。 最后,相关问题需要围绕用户可能进一步的问题,比如性能优化、数据保存、网络请求异常处理等。 现在需要检查是否有遗漏的信息,比如引用中的内容是否都涵盖。例如,引用3提到了JsonUtility无法处理复杂结构,引用2提到LitJsonJsonData类似字典,引用4提到Newtonsoft的使用方法。需要确保这些点都被正确引用并整合到回答中。 可能还需要注意代码格式的正确性,比如使用正确的语法高亮,确保代码中的尖括号转义,比如<T>在显示时应为<T>,但根据用户示例中的代码,可能直接使用原文中的格式。 最后,确保回答使用中文,行内公式用$...$,但在这个问题中可能涉及较少数学公式,但如果有变量或代码中的符号,需要正确格式化。</think>在Unity中解析生成JSON数据主要有以下4种方法,根据项目需求数据结构复杂度可选择不同方案: ### 一、使用Unity原生工具JsonUtility #### 解析JSON步骤: 1. 创建与JSON结构匹配的C#类 ```csharp [Serializable] // 必须添加序列化标签 public class PlayerData { public string playerName; public int level; public Vector3 position; } ``` 2. 读取JSON字符串并转换 ```csharp string jsonStr = "{\"playerName\":\"战士\",\"level\":10}"; PlayerData data = JsonUtility.FromJson<PlayerData>(jsonStr); ``` #### 生成JSON步骤: ```csharp PlayerData newData = new PlayerData(); string newJson = JsonUtility.ToJson(newData); ``` *特点*:无需导入插件,但无法处理字典/嵌套数组等复杂结构[^3] ### 二、使用LitJson插件(需导入LitJson.dll) #### 动态解析示例: ```csharp JsonData jsonData = JsonMapper.ToObject(jsonStr); string name = (string)jsonData["player"]["name"]; int hp = (int)jsonData["stats"]["health"]; ``` #### 生成带嵌套的JSON: ```csharp JsonData root = new JsonData(); root["items"] = new JsonData(); root["items"].Add("sword"); root["items"].Add("shield"); string output = root.ToJson(); ``` *优势*:支持动态类型复杂结构[^2] ### 三、使用Newtonsoft.Json(需导入DLL) #### 解析复杂结构: ```csharp using Newtonsoft.Json; PlayerProfile profile = JsonConvert.DeserializeObject<PlayerProfile>(jsonStr); ``` #### 生成含自定义格式的JSON: ```csharp var settings = new JsonSerializerSettings { Formatting = Formatting.Indented }; string json = JsonConvert.SerializeObject(data, settings); ``` *特点*:支持LINQ查询高级序列化设置[^4] ### 四、结合UnityWebRequest获取远程数据 ```csharp IEnumerator LoadRemoteJSON(){ UnityWebRequest request = UnityWebRequest.Get("http://api.example.com/data"); yield return request.SendWebRequest(); if(request.result == UnityWebRequest.Result.Success) { PlayerData data = JsonUtility.FromJson<PlayerData>(request.downloadHandler.text); } } ``` ### 方法对比表 | 方法 | 安装要求 | 复杂度支持 | 性能 | 额外功能 | |---------------|---------------|------------|------|--------------| | JsonUtility | 内置 | 简单结构 | 高 | 基础序列化 | | LitJson | 需导入DLL | 中等 | 中 | 动态类型解析 | | Newtonsoft | 需导入DLL | 复杂 | 中 | 高级格式化 | | UnityWebRequest| 内置 | 依赖组合 | 低 | 网络支持 | ### 注意事项 1. 类结构必须与JSON字段完全匹配(包括大小写) 2. 处理大型JSON文件时建议异步加载 3. 移动端使用需注意iOS的AOT编译限制 4. 对外部JSON数据需做有效性验证 ### 典型应用场景 - 游戏存档/读档JsonUtility+文件存储) - 网络API交互(UnityWebRequest+Newtonsoft) - 动态配置表加载(LitJson+ScriptableObject)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学与用

原创作者,在线要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值