【Unity数据交互】Unity中使用二进制进行数据持久化

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述


文章目录

    • 前言
    • 🎶(==1==) 数据相互转换
    • 🎶(==2==) 文件操作
    • 🎶(==3==) 文件夹操作
    • 🎶(==4==) 序列化
    • 🎶(==5==) 反序列化
    • 🎶(==6==)二进制加密
    • 🎶(==7==) BinaryData管理器
    • 🅰️系统路线学习点击跳转


前言

有符号 sbyte int short long
无符号 byte uint ushort ulong
浮点 float double decimal
特殊 bool char string

变量的本质是2进制,内存中以字节的形式存储,sizeof方法可以看到常用变量类型占用的字节空间长度

sizeof(sbyte)
sizeof(long) …

  • 节约存储空间,提升效率
  • 提升安全性

🎶(1 数据相互转换


  • 在Unity中各类型数据和字节数据相互转换

  • 1.将各类型转字节

byte[] bytes = BitConverter.GetBytes(256);
  • 2.字节数组转各类型
int i = BitConverter.ToInt32(bytes, 0);

为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。

在C#中有一个专门的编码格式类 来帮助我们将字符串和字节数组进行转换

游戏开发中常用编码格式 UTF-8
中文相关编码格式 GBK
英文相关编码格式 ASCII

  • 1.将字符串以指定编码格式转字节
byte[] bytes = Encoding.UTF8.GetBytes("你好");
  • 2.字节数组以指定编码格式转字符串
string str = Encoding.UTF8.GetString(bytes);

🎶(2 文件操作


命名空间: System.IO

  • 1.判断文件是否存在
     if(File.Exists(Application.dataPath + "/Text")){//存在}
  • 2.创建文件
FileStream fstream = File.Create(Application.dataPath + "/text");
  • 3.写入文件
     //字节数组 写入到指定路径的文件中byte[] bytes = BitConverter.GetBytes(100);File.WriteAllBytes(Application.dataPath + "/text", bytes);//string数组内容 一行行写入到指定路径中
string[] strs = new string[] { "姓名", "你好", "1", "23"};
File.WriteAllLines(Application.dataPath + "/text", strs);//字符串写入指定路径
File.WriteAllText(Application.dataPath + "/text", "xahhll");
  • 4.读取文件
        //读取字节数据bytes = File.ReadAllBytes(Application.dataPath + "/text");print(BitConverter.ToInt32(bytes, 0));//读取所有行信息
strs = File.ReadAllLines(Application.dataPath + "/text");for (int i = 0; i < strs.Length; i++){print(strs[i]);}//读取所有文本信息
print(File.ReadAllText(Application.dataPath + "/text"));
  • 5.删除文件
  File.Delete(Application.dataPath + "/text");//文件前提是关闭的
  • 6.复制文件
参数一:现有文件 需要是流关闭状态
参数二:目标文件File.Copy(Application.dataPath + "/text", Application.dataPath + "/text2", true);
  • 7.文件替换
        //参数一:用来替换的路径//参数二:被替换的路径//参数三:备份路径File.Replace(Application.dataPath + "/text", Application.dataPath + "/text2", Application.dataPath + "/备份text");
  • 8.以流的形式 打开文件并写入或读取

//参数一:路径
//参数二:打开模式
//参数三:访问模式
FileStream fs = File.Open(Application.dataPath + "/text", 
FileMode.OpenOrCreate, FileAccess.ReadWrite);

🎶(3 文件夹操作


命名空间:using System.IO
作用:增删查改文件夹

  • 1.判断文件夹是否存在
if( Directory.Exists(Application.dataPath + "/文件夹名"))
{print("存在");
}
  • 2.创建文件夹
DirectoryInfo info = Directory.CreateDirectory(Application.dataPath + "/文件夹名");
  • 3.删除文件夹
//参数一:路径
//参数二:true,将删除整个目录,false,仅当该目录为空时才删除
Directory.Delete(Application.dataPath + "/文件夹名");
  • 4.查找文件夹和文件
//得到所有文件夹名
string[] strs = Directory.GetDirectories(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{print(strs[i]);
}
//得到所有文件名
strs = Directory.GetFiles(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{print(strs[i]);
}
  • 5.移动文件夹
//移动会把文件夹中的所有内容一起移到新的路径
Directory.Move(Application.dataPath + "/文件夹名", Application.dataPath + "/路径");//该路径下面需为空
  • 6.创建文件夹方法的返回值
DirectoryInfo Info = Directory.CreateDirectory(Application.dataPath + "/文件夹名");
//全路径
print(Info .FullName);
//文件名
print(Info .Name);
  • 7.查找上级文件夹信息
Info = Directory.GetParent(Application.dataPath + "/文件夹名");
//全路径
print(Info .FullName);
//文件名
print(Info .Name);
  • 8.得到所有子文件夹的目录信息
DirectoryInfo[] dInfos = Info.GetDirectories();
FileInfo[] fInfos = dInfo.GetFiles();
for (int i = 0; i < fInfos.Length; i++)
{print("**************");print(fInfos[i].Name);//文件名print(fInfos[i].FullName);//路径print(fInfos[i].Length);//字节长度print(fInfos[i].Extension);//后缀名
}

🎶(4 序列化


序列化类对象

  • 1.第一步申明类对象

注意:如果要使用C#自带的序列化2进制方法
申明类时需要添加[System.Serializable]特性

  • 第二步—将对象进行2进制序列化
  Person p = new Person();        //主要方法:序列化方法 Serializeusing (MemoryStream ms = new MemoryStream()){//2进制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化对象 生成2进制字节数组 写入到内存流当中bf.Serialize(ms, p);//得到对象的2进制字节数组byte[] bytes = ms.GetBuffer();//存储字节File.WriteAllBytes(Application.dataPath + "/文件", bytes);//关闭内存流ms.Close();}

方法二:使用文件流进行存储
主要用于存储到文件中

  Person p = new Person();       using (FileStream fs = new FileStream(Application.dataPath + "/文件名", FileMode.OpenOrCreate, FileAccess.Write)){//2进制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化对象 生成2进制字节数组 写入到内存流当中bf.Serialize(fs, p);fs.Flush();fs.Close();}}
}

🎶(5 反序列化


  • 1.反序列化文件中数据
     using (FileStream fs = File.Open(Application.dataPath + "/文件名", FileMode.Open, FileAccess.Read)){//申明一个 2进制格式化类BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(fs) as Person;fs.Close();}
  • 2.反序列化网络传输过来的2进制数据

没有网络传输 就直接从文件中获取

  byte[] bytes = File.ReadAllBytes(Application.dataPath + "/文件名");//申明内存流对象 一开始就把字节数组传输进去using (MemoryStream ms = new MemoryStream(bytes)){//申明一个 2进制格式化类BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(ms) as Person;ms.Close();}

🎶(6二进制加密


  • 简单的异或加密和解密
       Person p = new Person();byte key = 199;using (MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, p);byte[] bytes = ms.GetBuffer();//异或加密for (int i = 0; i < bytes.Length; i++){bytes[i] ^= key;}File.WriteAllBytes(Application.dataPath + "/文件夹名", bytes);}//解密byte[] bytes2 = File.ReadAllBytes(Application.dataPath + "/文件夹名");for (int i = 0; i < bytes2.Length; i++){bytes2[i] ^= key;}using (MemoryStream ms = new MemoryStream(bytes2)){BinaryFormatter bf = new BinaryFormatter();Person p2 = bf.Deserialize(ms) as Person;ms.Close();}

🎶(7 BinaryData管理器


using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using UnityEngine;/// <summary>
/// 2进制数据管理器
/// </summary>
public class BinaryDataMgr
{/// <summary>/// 2进制数据存储位置路径/// </summary>public static string DATA_BINARY_PATH = Application.streamingAssetsPath + "/Binary/";/// <summary>/// 用于存储所有Excel表数据的容器/// </summary>private Dictionary<string, object> tableDic = new Dictionary<string, object>();/// <summary>/// 数据存储的位置/// </summary>private static string SAVE_PATH = Application.persistentDataPath + "/Data/";private static BinaryDataMgr instance = new BinaryDataMgr();public static BinaryDataMgr Instance => instance;//------后续代码请私信获取——————————————————————————
}

在这里插入图片描述

🅰️系统路线学习点击跳转


👨‍💻 Unity程序基础学习路线🧧
⭐【Unityc#专题篇】之c#进阶篇】🎁
⭐【Unityc#专题篇】之c#核心篇】🎁
⭐【Unityc#专题篇】之c#基础篇】🎁
⭐【Unity-c#专题篇】之c#入门篇】🎁
【Unityc#专题篇】—进阶章题单实践练习🎁
⭐【Unityc#专题篇】—基础章题单实践练习🎁
【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


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

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

相关文章

PostgreSQL 技术内幕(十七):FDW 实现原理与源码解析

对于一定规模的系统而言&#xff0c;数据仓库往往需要访问外部数据来完成分析和计算。外部数据包装器&#xff08;Foreign Data Wrapper&#xff0c; 简称 FDW&#xff09;是 PostgreSQL 提供的访问外部数据源机制。用户可以使用简单的 SQL 语句访问和操作外部数据源&#xff0…

[word] Word如何快速生成一段文本 #知识分享#学习方法

Word如何快速生成一段文本 Word如何快速生成一段文本&#xff1f;有时候我们会用一大段文字来做一些功能测试&#xff0c;不少朋友的做法就是脸滚键盘&#xff0c;一顿乱按&#xff0c;这样看起来文笔不通&#xff0c;看着也会比较难受&#xff0c;测试功能的效果也不怎么理想…

uniapp中实现跳转链接到游览器(安卓-h5)

uniapp中实现跳转链接到游览器&#xff08;安卓-h5&#xff09; 项目中需要做到跳转到外部链接&#xff0c;网上找了很多都不是很符合自己的要求&#xff0c;需要编译成app后是跳转到游览器打开链接&#xff0c;编译成web是在新窗口打开链接。实现的代码如下&#xff1a; 效果&…

java基于ssm+vue 旅游信息资源平台

1前台首页功能模块 旅游资源网站 &#xff0c;在系统首页可以查看首页、景点信息、酒店信息、客房信息、交流论坛、红色文化、个人中心、后台管理、客服等内容&#xff0c;如图1所示。 图1系统功能界面图 用户登录、用户注册&#xff0c;在注册页面可以填写用户名、密码、姓名…

DFS之剪枝与优化——AcWing 165. 小猫爬山

DFS之剪枝与优化 定义 DFS之剪枝与优化指的是在执行深度优先搜索(DFS, Depth-First Search)时&#xff0c;采取的一系列策略来减少搜索空间&#xff0c;避免无效计算&#xff0c;从而加速找到问题的解。剪枝是指在搜索过程中&#xff0c;当遇到某些条件不符合解的要求或者可以…

产科管理信息系统源码:产科电子病历、高危孕产妇五色管理系统源码 孕产妇健康管理信息平台源码

产科管理信息系统源码&#xff1a;产科电子病历、高危孕产妇五色管理系统源码 孕产妇健康管理信息平台源码 产科电子病历系统是以采集病人在整个医疗护理过程中所产生的各种信息。包括病案首页、门诊病历、住院病历、出院记录、病人病程记录等全部病历文书&#xff1b;涵盖文字…

宿舍报修小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;故障上报管理&#xff0c;新闻信息管理&#xff0c;维修人员管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;新闻信息…

node.js外卖小程序-计算机毕业设计源码81838

摘要 自从计算机发展开始&#xff0c;计算机软硬件相关技术的发展速度越来越快&#xff0c;在信息化高速发展的今天&#xff0c;计算机应用技术似乎已经应用到了各个领域。在餐饮行业&#xff0c;除了外卖以外就是到店里就餐&#xff0c;在店里就餐如果需要等待点餐的话&…

转盘输入法-单独鼠标版本

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 单独鼠标版本GIF演示 演示软件下载 转盘输入法https://download.csdn.net/download/u0146…

zdppy+vue3+antd 实现表格数据渲染

基本用法 <template><a-table :columns"columns" :data-source"data"><template #headerCell"{ column }"><template v-if"column.key name"><span>xxx Name</span></template></temp…

免费鼠标连点器有吗?需要付费吗?鼠标连点器电脑版免费推荐6款!

在数字化时代&#xff0c;鼠标连点器成为了许多用户提高工作效率、优化游戏体验的得力助手。然而&#xff0c;面对市场上琳琅满目的鼠标连点器软件&#xff0c;很多用户都会产生疑问&#xff1a;是否有免费的鼠标连点器&#xff1f;它们真的需要付费吗&#xff1f;今天&#xf…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…

十大排序:插入/希尔/选择/堆/冒泡/快速/归并/计数/基数/桶排序 汇总(C语言)

目录 前言非线性时间比较类插入排序(1) 直接插入排序(2) 希尔排序 选择排序(3) 选择排序优化版(4) 堆排序 交换排序(5) 冒泡排序(6) 快速排序hoare版本挖坑版前后指针版非递归版 归并排序(7) 归并排序递归版非递归版 线性时间比较类(8) 计数排序基数排序与桶排序 总结 前言 在计…

【unity实战】使用旧输入系统Input Manager 写一个 2D 平台游戏玩家控制器——包括移动、跳跃、滑墙、蹬墙跳

最终效果 文章目录 最终效果素材下载人物环境 简单绘制环境角色移动跳跃视差和摄像机跟随效果奔跑动画切换跳跃动画&#xff0c;跳跃次数限制角色添加2d物理材质&#xff0c;防止角色粘在墙上如果角色移动时背景出现黑线条方法一方法二 墙壁滑行实现角色滑墙不可以通过移动离开…

Web贵州旅游攻略系统-计算机毕业设计源码16663

目 录 第 1 章 引 言 1.1 选题背景与意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系…

前端面试题18(js字符串特定内容查找方法)

在JavaScript中&#xff0c;有多种方法可以用来查找字符串中的特定内容。以下是一些常用的方法&#xff0c;包括它们的用途和示例代码&#xff1a; 1. indexOf() indexOf() 方法返回指定文本在字符串中第一次出现的索引&#xff08;位置&#xff09;&#xff0c;如果没有找到…

【vue组件库搭建04】使用vitepress搭建站点并部署到github

前言 基于vitePress搭建文档站点&#xff0c;使用github pages进行部署 安装VitePress 1.Node.js 18 及以上版本 2.npm add -D vitepress 3.npx vitepress init 4.将需要回答几个简单的问题&#xff1a; ┌ Welcome to VitePress! │ ◇ Where should VitePress initi…

Cesium 二三维热力图

Cesium 二三维热力图 原理&#xff1a;主要依靠heatmap.js包来实现 效果图&#xff1a;

从零开始使用WordPress搭建个人网站并一键发布公网详细教程

文章目录 前言1. 搭建网站&#xff1a;安装WordPress2. 搭建网站&#xff1a;创建WordPress数据库3. 搭建网站&#xff1a;安装相对URL插件4. 搭建网站&#xff1a;内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 固定WordPress公网地址5.1. 固定地…

【LabVIEW学习篇 - 2】:LabVIEW的编程特点

文章目录 LabVIEW的编程特点图形编程天然并行运行基于数据流运行 LabVIEW的编程特点 图形编程 LabVIEW使用图形化的图形化编程语言&#xff08;G语言&#xff09;&#xff0c;用户通过在程序框图中拖放和连接各种节点&#xff08;Nodes&#xff09;来编写程序。每个节点代表一…