Unity PC和Android端的数据存储和读取

使用Resource:

提示:使用resouce打包后会被压缩进.resources文件中,意味着它是只读文件,且必须使用resouce.load加载:

    /// <summary>/// 全平台使用/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <returns></returns>static public T LoadJsonOnResource<T>(string fileName){Debug.Log("我是Resources读取");string json = "";TextAsset text = Resources.Load<TextAsset>("Jsons/" + fileName);json = text.text;Debug.Log("json: " + json);if (string.IsNullOrEmpty(json)){Debug.LogWarning("this json is null !");return default(T);}T result = JsonUtility.FromJson<T>(json);return result;}

PC端写入

    /// <summary>/// 仅支持Windows平台写入/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path"></param>/// <param name="fileName"></param>/// <param name="info"></param>static public void SaveJsonOnWin<T>(PathType path, string fileName, T info){string url = "";if (path == PathType.ResourcePath){url = Application.dataPath + "/Resources/Jsons/" + fileName;}else if (path == PathType.StreamingAssetsPath){url = Application.streamingAssetsPath + "/" + fileName;}else{url = Application.dataPath + "/" + fileName;}Debug.Log("url:     " + url);if (File.Exists(url)){File.Delete(url);}File.Create(url).Dispose();//这里不加dispose会报错,很重要string json = JsonUtility.ToJson(info);Debug.Log("json: " + json);try{StreamWriter sw = new StreamWriter(url);sw.WriteLine(json);sw.Close();Debug.Log("写入成功");}catch (Exception){Debug.Log("json出错");}}

PC端读取:

    static public T LoadJsonOnWinPath<T>(PathType path, string fileName){string url = "";if (path == PathType.StreamingAssetsPath){url = Application.streamingAssetsPath + "/" + fileName;Debug.Log("我是StreamingAssetsPath读取\n" + url);}else{url = Application.dataPath + "/" + fileName;Debug.Log("我是NormalPath读取\n" + url);}if (!File.Exists(url)){Debug.LogWarning("path is null !     " + fileName);return default(T);}StreamReader sr = new StreamReader(url);string json = sr.ReadToEnd();Debug.Log("json: " + json);T result = default(T);if (!string.IsNullOrEmpty(json)){result = JsonUtility.FromJson<T>(json);}sr.Close();return result;}

Android端写入:

提示: PersistentDataPath使用该路径写入

    /// <summary>/// android平台只有该路径支持写入/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path"></param>/// <param name="fileName"></param>/// <param name="info"></param>static public void SaveJsonOnAndroid<T>(string fileName, T info){string url = Path.Combine(Application.persistentDataPath, fileName);Debug.Log("我是PersistentDataPath存储\n" + url);StreamWriter sw = null;if (!File.Exists(url)){sw = File.CreateText(url);}string json = JsonUtility.ToJson(info);Debug.Log("json: " + json);sw.WriteLine(json);sw.Close();}

Android端读取:

    static public T LoadJsonOnAndroid<T>(PathType path, string file){string url = "";if (path == PathType.PersistentDataPath){url = Application.persistentDataPath + "/" + file;Debug.Log("我是PersistentDataPath读取\n" + url);}string json = "";if (File.Exists(url)){try{FileStream fileStream = new FileStream(url, FileMode.OpenOrCreate);StreamReader sr = new StreamReader(fileStream, Encoding.UTF8);json = sr.ReadToEnd();Debug.Log("fileStream   json: " + json);T result = default(T);if (!string.IsNullOrEmpty(json)){result = JsonUtility.FromJson<T>(json);}sr.Close();return result;}catch{Debug.LogFormat("url:   {0} error or stream error", url);}}else{Debug.LogError("file not exist  " + url);}return default(T);}

注意:Android端的StreamingAssets读取不能使用该方法读取。

最后附上完整代码

using System;
using System.IO;
using System.Text;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class JsonExtension
{/// <summary>/// 全平台使用/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <returns></returns>static public T LoadJsonOnResource<T>(string fileName){Debug.Log("我是Resources读取");string json = "";TextAsset text = Resources.Load<TextAsset>("Jsons/" + fileName);json = text.text;Debug.Log("json: " + json);if (string.IsNullOrEmpty(json)){Debug.LogWarning("this is jsons is null !");return default(T);}T result = JsonUtility.FromJson<T>(json);return result;}/// <summary>/// 仅支持Windows平台写入/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path"></param>/// <param name="fileName"></param>/// <param name="info"></param>static public void SaveJsonOnWin<T>(PathType path, string fileName, T info){string url = "";if (path == PathType.ResourcePath){url = Application.dataPath + "/Resources/Jsons/" + fileName;}else if (path == PathType.StreamingAssetsPath){url = Application.streamingAssetsPath + "/" + fileName;}else{url = Application.dataPath + "/" + fileName;}Debug.Log("url:     " + url);if (File.Exists(url)){File.Delete(url);}File.Create(url).Dispose();string json = JsonUtility.ToJson(info);Debug.Log("json: " + json);try{StreamWriter sw = new StreamWriter(url);sw.WriteLine(json);sw.Close();Debug.Log("写入成功");}catch (Exception){Debug.Log("json出错");}//sw.Flush();//FileStream fs = new FileStream(url, FileMode.OpenOrCreate);//byte[] byteArray = Encoding.UTF8.GetBytes(info);//foreach (var by in byteArray)//{//    fs.WriteByte(by);//}}static public T LoadJsonOnWinPath<T>(PathType path, string fileName){string url = "";if (path == PathType.StreamingAssetsPath){url = Application.streamingAssetsPath + "/" + fileName;Debug.Log("我是StreamingAssetsPath读取\n" + url);}else{url = Application.dataPath + "/" + fileName;Debug.Log("我是NormalPath读取\n" + url);}if (!File.Exists(url)){Debug.LogWarning("path is null !     " + fileName);return default(T);}StreamReader sr = new StreamReader(url);string json = sr.ReadToEnd();Debug.Log("json: " + json);T result = default(T);if (!string.IsNullOrEmpty(json)){result = JsonUtility.FromJson<T>(json);}sr.Close();return result;}/// <summary>/// android平台只有该路径支持写入/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path"></param>/// <param name="fileName"></param>/// <param name="info"></param>static public void SaveJsonOnAndroid<T>(string fileName, T info){string url = Path.Combine(Application.persistentDataPath, fileName);Debug.Log("我是PersistentDataPath存储\n" + url);StreamWriter sw = null;if (!File.Exists(url)){sw = File.CreateText(url);}string json = JsonUtility.ToJson(info);Debug.Log("json: " + json);sw.WriteLine(json);sw.Close();}static public T LoadJsonOnAndroid<T>(PathType path, string file){string url = "";if (path == PathType.PersistentDataPath){url = Application.persistentDataPath + "/" + file;Debug.Log("我是PersistentDataPath读取\n" + url);}string json = "";if (File.Exists(url)){try{FileStream fileStream = new FileStream(url, FileMode.OpenOrCreate);StreamReader sr = new StreamReader(fileStream, Encoding.UTF8);json = sr.ReadToEnd();Debug.Log("fileStream   json: " + json);T result = default(T);if (!string.IsNullOrEmpty(json)){result = JsonUtility.FromJson<T>(json);}sr.Close();return result;}catch{Debug.LogFormat("url:   {0} error or stream error", url);}}else{Debug.LogError("file not exist  " + url);}return default(T);}public enum PathType{ResourcePath,StreamingAssetsPath,PersistentDataPath,NormalPath}
}
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;public class TestJson : MonoBehaviour
{#region Windowspublic Button btn1;public Button btn2;public Button btn3;public Button btn4;#endregion#region Androidpublic Button btn5;public Button btn6;public Button btn7;public Button btn8;#endregionpublic GameObject[] WinBtns;public GameObject[] AndroidBtns;void Start(){MyJsonData data1 = new MyJsonData(10, "alibaba", Vector3.one);MyJsonData data2 = new MyJsonData(20, "tx", Vector3.one);if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer){for (int i = 0; i < WinBtns.Length; i++){WinBtns[i].gameObject.SetActive(true);}btn1.onClick.AddListener(() =>{JsonExtension.SaveJsonOnWin(JsonExtension.PathType.ResourcePath, "test1.json", data1);});btn2.onClick.AddListener(() =>{JsonExtension.SaveJsonOnWin(JsonExtension.PathType.StreamingAssetsPath, "test2.json", data1);});btn3.onClick.AddListener(() =>{JsonExtension.LoadJsonOnResource<MyJsonData>("test1");});btn4.onClick.AddListener(() =>{JsonExtension.LoadJsonOnWinPath<MyJsonData>(JsonExtension.PathType.StreamingAssetsPath, "test2.json");});}if (Application.platform == RuntimePlatform.Android){for (int i = 0; i < AndroidBtns.Length; i++){AndroidBtns[i].gameObject.SetActive(true);}btn5.onClick.AddListener(() =>{JsonExtension.SaveJsonOnAndroid("test3.json", data2);});btn6.onClick.AddListener(() =>{JsonExtension.LoadJsonOnResource<MyJsonData>("test1");});btn7.onClick.AddListener(() =>{//直接读会报错,必须使用UnityWebRequest读取//je.LoadJsonOnAndroid<MyJsonData>(JsonExtension.PathType.StreamingAssetsPath, "test2.json");StartCoroutine(LoadFromStreamingAssets(Application.streamingAssetsPath + "/test2.json"));});btn8.onClick.AddListener(() =>{JsonExtension.LoadJsonOnAndroid<MyJsonData>(JsonExtension.PathType.PersistentDataPath, "test3.json");});}}IEnumerator LoadFromStreamingAssets(string url){using (UnityWebRequest request = UnityWebRequest.Get(url)){yield return request.SendWebRequest();if (request.isDone){if (request.isNetworkError || request.isHttpError){Debug.Log(request.error);}else{Debug.Log("我是UnityWebRequest读取安卓");string androidJson = request.downloadHandler.text;Debug.Log("androidJson: " + androidJson);/** 对json做处理*/}}}}
}[Serializable]
public class MyJsonData
{public int id;public string name;public Vector3 pos;public MyJsonData(int id, string name, Vector3 pos){this.id = id;this.name = name;this.pos = pos;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文学习——动态多目标优化的一种新的分位数引导的对偶预测策略

论文题目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 动态多目标优化的一种新的分位数引导的对偶预测策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免费”的可视化大屏案例分享-智慧园区综合管理平台

一.智慧园区是什么&#xff1f; 智慧园区是一种融合了新一代信息与通信技术的先进园区发展理念。它通过迅捷信息采集、高速信息传输、高度集中计算、智能事务处理和无所不在的服务提供能力&#xff0c;实现了园区内及时、互动、整合的信息感知、传递和处理。这样的园区旨在提高…

自定义注解-手机号验证注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手机号校验注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正确使用Pytorch Geometric打开Cora(Planetoid)数据集

文章目录 关于报错&#xff08;"Cannot connect to host"&#xff09;解决方法 关于报错&#xff08;“Cannot connect to host”&#xff09; 我们在使用PyG调用Planetoid数据集的时候&#xff0c;常会碰到如下报错&#xff1a; 解决方法就是手动下载这个数据集。…

在 AWS Lambda 中使用 Flask 应用

本文将介绍如何在 AWS Lambda 中创建和部署一个使用 Flask 框架的应用。 1. 创建 Lambda 函数 首先,在 AWS Lambda 控制台创建一个新的函数,命名为 ​​flask-app​​。 2. 准备 Flask 层 为了在 Lambda 中使用 Flask,我们需要创建一个包含 Flask 库的层。按照以下步骤操…

java中如何使用ffmpeg命令来实现视频编码转换

在Java中使用FFmpeg命令来进行视频编码转换&#xff0c;可以通过调用系统命令来执行FFmpeg命令。下面是一个使用FFmpeg进行视频转码的示例代码&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class FFmpegVideoConverter {public stat…

前端播放RTSP视频流,使用FLV请求RTSP视频流播放(Vue项目,在Vue中使用插件flv.js请求RTSP视频流播放)

简述&#xff1a;在浏览器中请求 RTSP 视频流并进行播放时&#xff0c;直接使用原生的浏览器 API 是行不通的&#xff0c;因为它们不支持 RTSP 协议。为了解决这个问题&#xff0c;开发者通常会选择使用像 flv.js 这样的库&#xff0c;它专为在浏览器中播放 FLV 和其他流媒体格…

MySQL 代理层:ProxySQL

文章目录 说明安装部署1.1 yum 安装1.2 启停管理1.3 查询版本1.4 Admin 管理接口 入门体验功能介绍3.1 多层次配置系统 读写分离将实例接入到代理服务定义主机组之间的复制关系配置路由规则事务读的配置延迟阈值和请求转发 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

Java实现日志全链路追踪.精确到一次请求的全部流程

广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…

Android network - NUD检测机制(Android 14)

Android network - NUD检测机制 1. 前言2. 源码分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系统中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是网络中的邻居不可达检测机制&#xff0c;它用于检测设备是…

数据驱动测试实践:Postman 中使用数据文件的指南

Postman 是一个强大的 API 开发和测试工具&#xff0c;它支持数据驱动测试&#xff0c;允许测试者使用外部数据文件来驱动测试&#xff0c;实现测试用例的参数化。数据驱动测试可以显著提高测试效率&#xff0c;减少重复工作&#xff0c;并允许测试用例覆盖更广泛的输入场景。本…

一文了解常见DNS问题

当企业的DNS出现故障时&#xff0c;为不影响企业的正常运行&#xff0c;团队需要能够快速确定问题的性质和范围。那么有哪些常见的DNS问题呢&#xff1f; 域名解析失败&#xff1a; 当您输入一个域名&#xff0c;但无法获取到与之对应的IP地址&#xff0c;导致无法访问相应的网…

【代码随想录算法训练营第五十九天|卡码网110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长】

文章目录 卡码网110.字符串接龙105.有向图的完全可达性106.岛屿的周长 卡码网110.字符串接龙 这题是在字符串上进行广搜&#xff0c;字符串广搜是对一个字符串按照位置来搜索&#xff0c;与原字符串只有一个位置字符不同那么就是在原字符串的基础上距离加1。因此需要一个字典来…

获取VC账号,是成为亚马逊供应商的全面准备与必要条件

成为亚马逊的供应商&#xff0c;拥有VC&#xff08;Vendor Central&#xff09;账号&#xff0c;是众多制造商和品牌所有者的共同目标。这不仅代表了亚马逊对供应商的高度认可&#xff0c;也意味着获得了更多的销售机会和更广阔的市场前景。 全面准备与必要条件是获取VC账号的关…

代码转换成AST语法树移除无用代码console.log、import

公司中代码存在大量,因此产生 可以使用 @babel/parser 解析代码生成 AST (抽象语法树),然后使用 @babel/traverse 进行遍历并删除所有的 console.log 语句,最后使用 @babel/generator 生成修改后的代码。 这里有一个网址,可以线上解析代码转换成AST语法树: https://astex…

Python爬虫康复训练——笔趣阁《神魂至尊》

还是话不多说&#xff0c;很久没写爬虫了&#xff0c;来个bs4康复训练爬虫&#xff0c;正好我最近在看《神魂至尊》&#xff0c;爬个txt文件下来看看 直接上代码 """ 神魂至尊网址-https://www.bqgui.cc/book/1519/ """ import requests from b…

【C++】 解决 C++ 语言报错:未定义行为(Undefined Behavior)

文章目录 引言 未定义行为&#xff08;Undefined Behavior, UB&#xff09;是 C 编程中非常危险且难以调试的错误之一。未定义行为发生时&#xff0c;程序可能表现出不可预测的行为&#xff0c;导致程序崩溃、安全漏洞甚至硬件损坏。本文将深入探讨未定义行为的成因、检测方法…

零基础STM32单片机编程入门(七)定时器PWM波输出实战含源码视频

文章目录 一.概要二.PWM产生框架图三.CubeMX配置一个TIME输出1KHZ&#xff0c;占空比50%PWM波例程1.硬件准备2.创建工程3.测量波形结果 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&…

通过营销本地化解锁全球市场

在一个日益互联的世界里&#xff0c;企业必须接触到全球各地的不同受众。营销本地化是打开这些全球市场的关键。它包括调整营销材料&#xff0c;使其与不同地区的文化和语言细微差别产生共鸣。以下是有效的营销本地化如何推动您的全球扩张&#xff0c;并用实际例子来说明每一点…