下面介绍几种 Unity本地记录存储的实现方式。

第一种 Unity自身提供的 PlayerPrefs

//保存数据


  1. PlayerPrefs.SetString("Name",mName);
  2. PlayerPrefs.SetInt("Age",mAge);
  3. PlayerPrefs.SetFloat("Grade",mGrade)

//读取数据


  1. mName=PlayerPrefs.GetString("Name","DefaultValue");
  2. mAge=PlayerPrefs.GetInt("Age",0);
  3. mGrade=PlayerPrefs.GetFloat("Grade",0F);

//清除所有记录

 PlayerPrefs.DeleteAll();

//删除其中某一条记录

PlayerPrefs.DeleteKey("Age");

//将记录写入磁盘

PlayerPrefs.Save()

第二种 BinaryFormatter 二进制序列化

假设有一个Player类


  1. [System. Serializable]
  2. public class Player
  3. {
  4. public int health;
  5. public int power;
  6. public Vector3 position;
  7. }

由于BinaryFormatter序列化不支持Unity的Vector3类型,所以我们需要做一下包装。


  1. public class PlayerData{
  2. public int level;
  3. public int health;
  4. public float[] position;
  5. public PlayerData(Player player)
  6. {
  7. this.level = player.level;
  8. this.health = player.health;
  9. this.position = new float[3];
  10. this.position[0] = player.transform.position.x;
  11. this.position[1] = player.transform.position.y;
  12. this.position[2] = player.transform.position.z;
  13. }
  14. }

我们对PlayerData进行保存和读取。读取出来的PlayerData可以赋给Player。


  1. public static class SaveSystem{
  2. //保存数据
  3. public static void SavePlayer(Player player)
  4. {
  5. BinaryFormatter formatter = new BinaryFormatter();
  6. string path = Application.persistentDataPath+"/player.fun";
  7. FileStream stream = new FileStream(path,FileMode.Create);
  8. PlayerData data = new PlayerData(player);
  9. formatter.Serialize(stream,data);
  10. stream.Close();
  11. }
  12. //读取数据
  13. public static PlayerData LoadPlayer()
  14. {
  15. string path = Application.persistentDataPath+"/player.fun";
  16. if(File.Exists(path))
  17. {
  18. BinaryFormatter formatter = new BinaryFormatter();
  19. FileStream stream = new FileStream(path,FileMode.Open);
  20. PlayerData data = formatter.Deserialize(stream) as PlayerData;
  21. stream.Close();
  22. return data;
  23. }else{
  24. Debug.LogError("Save file not found in "+path);
  25. return null;
  26. }
  27. }
  28. }

第三种 保存为json格式的文本文件

使用 Unity 自身API JsonUtility。

保存数据


  1. public static void SavePlayerJson(Player player)
  2. {
  3. string path = Application.persistentDataPath+"/player.json";
  4. var content = JsonUtility.ToJson(player,true);
  5. File.WriteAllText(path,content);
  6. }

读取数据


  1. public static PlayerData LoadPlayerJson()
  2. {
  3. string path = Application.persistentDataPath+"/player.json";
  4. if(File.Exists(path)){
  5. var content = File.ReadAllText(path);
  6. var playerData = JsonUtility.FromJson<PlayerData>(content);
  7. return playerData;
  8. }else{
  9. Debug.LogError("Save file not found in "+path);
  10. return null;
  11. }
  12. }

第四种 XmlSerializer进行串行化

假如有类


  1. public class Entity
  2. {
  3. public Entity()
  4. {
  5. }
  6. public Entity(string c, string f)
  7. {
  8. name = c;
  9. school = f;
  10. }
  11. public string name;
  12. public string school;
  13. }

读取数据


  1. List<Entity> entityList=null;
  2. XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
  3. using (StreamReader sr = new StreamReader(configPath))
  4. {
  5. entityList = xs.Deserialize(sr) as List<Entity>;
  6. }

保存数据


  1. List<Entity> entityList=null;
  2. XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
  3. using (StreamWriter sw = File.CreateText(configPath))
  4. {
  5. xs.Serialize(sw, entityList);
  6. }

对应的xml文件为:


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ArrayOfEntity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  3. <Entity>
  4. <Name>Alice</Name>
  5. <School>SJTU</School>
  6. </Entity>
  7. <Entity>
  8. <Name>Cici</Name>
  9. <School>CSU</School>
  10. </Entity>
  11. <Entity>
  12. <Name>Zero</Name>
  13. <School>HIT</School>
  14. </Entity>
  15. </ArrayOfEntity>

Unity3D 本地数据持久化几种方式的更多相关文章

  1. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  2. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

  3. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  4. python爬虫---爬虫的数据解析的流程和解析数据的几种方式

    python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...

  5. Solr 删除数据的几种方式

    原文出处:http://blog.chenlb.com/2010/03/solr-delete-data.html 有时候需要删除 Solr 中的数据(特别是不重做索引的系统中,在重做索引期间).删除 ...

  6. SparkStreaming获取kafka数据的两种方式:Receiver与Direct

    简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...

  7. SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式

    SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...

  8. 【代码笔记】iOS-向服务器传JSON数据的两种方式

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  9. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

随机推荐

  1. [Qt] Librecad 源码分析

    libraries jwwlib libdxfrw:一个免费的C++库,用于读写文本格式或二进制格式的DXF文件(C++ library to read and write DXF/DWG files ...

  2. canal 环境搭建 canal 与kafka通信(三)

    canal 占用了生产者 .net core端 使用消费者获取canal 消息 安装 Confluent.Kafka  demo使用 1.3.0 public static void Consumer ...

  3. 性能工具 stream 最新版本5.10 The STREAM benchmark

    官网下载最新性能工具 stream 最新版本5.10 https://github.com/jeffhammond/STREAM 官网下载最新性能工具 stream 最新版本5.10   http:/ ...

  4. 二进制部署K8S-1基本概念

    二进制部署K8S-1基本概念 感谢老男孩教育王导的公开视频,文档整理自https://www.yuque.com/duduniao/k8s. 1.实验环境 1.1 虚拟机 因为在后期运行容器需要有大量 ...

  5. 目录和文件 按创建时间排序du -h --time --max-depth=1 . |sort -r -t $'\t' -k 2 Linux查看文件夹大小,并按文件夹创建时间排序

    目录和文件 按创建时间排序 # du -h --time --max-depth=1 . |sort -r -t $'\t' -k 230M 2020-04-01 14:54 .28K 2020-04 ...

  6. C语言关于指针函数与函数指针个人理解

    1,函数指针 顾名思义,即指向函数的指针,功能与其他指针相同,该指针变量保存的是所指向函数的地址. 假如是void类型函数指针定义方式可以是 void (*f)(参数列表);亦可以先用 typedef ...

  7. GO学习-(38) Go语言结构体转map[string]interface{}的若干方法

    结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...

  8. Docker学习(8) Docker的CS模式

    Docker的CS模式 链接方式   socket

  9. ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心

    作者:Grey 原文地址:ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 很多程序往 ...

  10. 人体姿态和形状估计的视频推理:CVPR2020论文解析

    人体姿态和形状估计的视频推理:CVPR2020论文解析 VIBE: Video Inference for Human Body Pose and Shape Estimation 论文链接:http ...