[Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法

news/2025/3/14 13:46:30/

学习目标:

 如果你和我同样苦恼于游戏相关的数据怎么存储与读取,那么不妨看看这个up主有关Unity存档系统的教程。[Unity] 存档系统 Part 1 | PlayerPrefs | Unity初学者系列教程 | 数据存取 | 存档读档 | Save&Load_哔哩哔哩_bilibili在本视频中你将学到Unity引擎中三种常见的数据存储方式中的第一种:PlayerPrefs主要内容:什么是PlayerPrefs如何使用PlayerPrefsPlayerPrefs的优缺点以及适用范围构建一个基于PlayerPrefs的基础数据存取系统Unity存档系统第二部分 - JSON:BV1Cb4y1b71G————————————————————你好啊,我是阿严,一个小小的独立游戏开发者https://www.bilibili.com/video/BV1nQ4y1z7pZ/?spm_id_from=333.788.recommend_more_video.-1

这里我将up主讲到的内容作为笔记,先给大伙开个头介绍JSON。


学习内容:

  这里引用以为CSDN博主给JSON的介绍(JSON 基本使用_兮动人的博客-CSDN博客_json.cn怎么用icon-default.png?t=M4ADhttps://blog.csdn.net/qq_41684621/article/details/113851644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165301480816781483799120%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165301480816781483799120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-113851644-null-null.142^v10^control,157^v4^control&utm_term=JSON&spm=1018.2226.3001.4187

JSON,全称是 JavaScript Object Notation,即 JavaScript对象标记法。


JSON是一种轻量级(Light-Meight)、基于文本的(Text-Based)、可读的(Human-Readable)格式。


JSON 的名称中虽然带有JavaScript,但这是指其语法规则是参考JavaScript对象的,而不是指只能用于JavaScript 语言。


JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML(另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。


近年来JavaScript已经成为浏览器上事实上的标准语言,JavaScript 的风靡,与JSON 的流行也有密切的关系。


因为JSON本身就是参考JavaScript 对象的规则定义的,其语法与JavaScript定义对象的语法几乎完全相同。


JSON格式的创始人声称此格式永远不升级,这就表示这种格式具有长时间的稳定性,10 年前写的文件,10年后也能用,没有任何兼容性问题。


原文链接:https://blog.csdn.net/qq_41684621/article/details/113851644

了解完什么是JSON后让我们看看官方API中关于JSON的属性

转化为JSON格式,我们需要一个object类型,一个bool是为了将文本转为可读性更高的JavaScript格式 

 

这个复写函数可以覆盖掉我们之前创建的object类型,用一个新的string类型的json来覆盖掉原有的数据 

 

 

需要注意的是,转化的时候不应该用字段,这与json本身的特性有关,当你转化的时候会发现只有一个大括号,而是要将整个类一起转化,而且接受转化的数据类型必须是支持Untiy序列化,像什么static静态,readonly字段,是不能进行转化,up主非常贴心的制作了一张表格用来列出那些数据类型支持转化大伙务必要去看看。

 

 

了解上述属性和特征之类的以后,我们就可以使用JSON来存储不同类型的数据了。 

代码部分:

  回到Unity中我们重新写SaveSystem脚本,这里涉及到的有try,catch捕获异常语句块,Path.Combine()将两个路径目录合并起来

Application.persistentDataPath因为发布到不同平台上的目录各有不同,使用这个属性能让我们保存的数据适应不同平台上。

using UnityEngine;
using System.IO;
namespace SaveSystemTur
{public static  class SaveSystem{#region JSONpublic static void SaveByJSON(string saveFileName, object data){var json = JsonUtility.ToJson(data);var path = Path.Combine(Application.persistentDataPath + saveFileName);try{File.WriteAllText(path, json);#if UNITY_EDITORDebug.Log($"Successfully save file to {path} . ");
#endif}catch (System.Exception exception){#if UNITY_EDITORDebug.LogError($"Failed to save file to {path}\n {exception}");
#endif}}public static T LoadFromJSON<T>(string saveFileName){var path = Path.Combine(Application.persistentDataPath, saveFileName);try {var json = File.ReadAllText(path);var data = JsonUtility.FromJson<T>(json);return data;}catch(System.Exception exception){
#if UNITY_EDITORDebug.LogError($"Failed to load file to {path}\n {exception}");
#endifreturn default;}}#endregion#region DELETEpublic static void DeleteFile(string saveFileName){var path = Path.Combine(Application.persistentDataPath, saveFileName);try{File.Delete(path);}catch (System.Exception exception){
#if UNITY_EDITORDebug.LogError($"Failed to delete file to {path}\n {exception}");
#endif}}#endregion}
}

完成后我们回到NewPlayerData上,比之前更省略的是我们除了SaveData和LoadData之外,我们只用了两个两三行函数从SaveSystem上调用函数即实现了保存Json格式文件。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace SaveSystemTur
{public class NewPlayerData : MonoBehaviour{private const string PLAYER_DATA_KEY = "PlayerData";private const string PLAYER_DATA_FILE_NAME = "PlayerData.sav";#region Fields[SerializeField] string playerName = "";[SerializeField] int coin = 0;[SerializeField] int level = 0;[System.Serializable]class SaveData{public string playerName;public int playerLevel;public int playerCoin;public Vector3 playerPosition;}#endregion#region Propertriespublic string PlayerName => playerName;public int Coin => coin;public int Level => level;public Vector3 Position => transform.position;#endregion#region Save And Loadpublic void Save(){SaveByJSON();}public void Load(){LoadFromJSON();}private SaveData SavingData(){var saveData = new SaveData();saveData.playerName = playerName;saveData.playerCoin = coin;saveData.playerLevel = level;saveData.playerPosition = transform.position;return saveData;}private void LoadData(SaveData saveData){playerName = saveData.playerName;level = saveData.playerLevel;coin = saveData.playerCoin;transform.position = saveData.playerPosition;}[UnityEditor.MenuItem("Developer/Delete Player Data Prefs")]public static void DeletePlayerDataPrefs(){//PlayerPrefs.DeleteAll();PlayerPrefs.DeleteKey(PLAYER_DATA_KEY);}[UnityEditor.MenuItem("Developer/Delete Player Data Save File")]public static void DeletePlayerDataSaveFile(){//PlayerPrefs.DeleteAll();PlayerPrefs.DeleteKey(PLAYER_DATA_FILE_NAME);}#endregion#region JSONvoid SaveByJSON(){SaveSystem.SaveByJSON(PLAYER_DATA_FILE_NAME, SavingData());}void LoadFromJSON(){var saveData = SaveSystem.LoadFromJSON<SaveData>(PLAYER_DATA_FILE_NAME);LoadData(saveData);}#endregion}
}

 其实可以在SaveByJSON为我们创建的文件的名字上给上保存日期

void SaveByJSON(){SaveSystem.SaveByJSON($"{System.DateTime.Now:yyyy.dd.M HH-MM-ss}.sav", SavingData());//SaveSystem.SaveByJSON(PLAYER_DATA_FILE_NAME, SavingData());}

这样我们的文件就陈宫保存在C盘了,而且也有我们按下保存的日期。


http://www.ppmy.cn/news/911431.html

相关文章

matlab: 03(2) cell、存档和读档

学习素材&#xff1a;MATLAB教程_台大郭彦甫&#xff08;14课&#xff09;原视频补档 MATLAB教學 - 04变数&#xff08;变量&#xff09;与档案存取_哔哩哔哩_bilibili &#xff08;部分素材使用视频截图&#xff09; 目录 一、cell 1.两种构造方法 2.matrix into a cell …

Unity存档

Unity3D输出Android透明背景的实现&#xff1a; 1.Player Settings -> Resolution and Presentation -> Render Over Native UI //可不用设置此选项 2.相机的camera flag设为Solid color 3.相机的background RGBA values to (0,0,0,0) 4.Unity对应的activity标签…

闪客工具:ghostcat

一套不错的工具类库&#xff0c;里面包含了很多不错新鲜概念。 AS3的通用工具类库(AS3 library of generic tools) http://wiki.9ria.com/index.php/GhostCat#.E4.BB.8B.E7.BB.8D

计算机领域闪客是指,第一单元闪客之门.doc

第一单元闪客之门 第1单元 闪客之门(第1-3课) 一、单元概述 本单元通过学生对Flash 8的逐步了解&#xff0c;初步感受制作动画的乐趣&#xff0c;体验踏入闪客之门的喜悦。 在本单元中&#xff0c;通过任务驱动、竞赛等方式&#xff0c;充分调动学生的参与热情与创新意识&#…

Pikachu 通关笔记

Pikachu 靶机练习 1、暴力破解1.1 基于表单的暴力破解1.2 验证码绕过(on server)1.3 验证码绕过(on client)1.4 验证码绕过(token 防爆破) 2、Cross-Site Scripting-XSS2.1 反射型(get)2.2 反射型(post)2.3 存储型xss2.4 DOM型xss2.5 DOM型xss-x2.6 XSS之盲打2.7 XSS之过滤2.8 …

博德之门2增强版存档_《博德之门2:增强版》存档位置及修改方法

虽然博德之门系列游戏是比较老的游戏&#xff0c;但游戏性还是非常不错的&#xff0c;可能对画面党来说游戏有些难接受&#xff0c;不过真正融入游戏还是会发现这款作品的乐趣所在&#xff0c;最近不少玩家问到游戏存档位置&#xff0c;下面是详细解析。 存档位置及修改方法 第…

Unity中常用的游戏存档/读档技术

Unity中常用的游戏存档/读档技术 1.PlayerPrefs:是Unity提供的一个用于本地持久化保存与读取的类&#xff0c;是以键值对的形式将数据写入到注册表中&#xff0c;并且可以提供方法来按照键来取出对应的值应用到游戏中&#xff0c;适用于保存较为简单的游戏数据。对应的方法如下…

今天把闪客2通关了 …^^…

闪客2最后一关真不是一般的难过&#xff0c;有一段是用架台机枪打的&#xff0c;键盘只有8个方向&#xff0c;仅打仅挂&#xff0c;我火了&#xff0c;借了豪哥的北通手柄&#xff0c;试了十多次强过&#xff0c;然后杀到了boss&#xff0c;开连发轻松虐过&#xff0c;hohoho~~…