Unity3D 本地数据持久化几种方式
下面介绍几种 Unity本地记录存储的实现方式。
第一种 Unity自身提供的 PlayerPrefs
//保存数据
-
PlayerPrefs.SetString("Name",mName);
-
PlayerPrefs.SetInt("Age",mAge);
-
PlayerPrefs.SetFloat("Grade",mGrade)
//读取数据
-
mName=PlayerPrefs.GetString("Name","DefaultValue");
-
mAge=PlayerPrefs.GetInt("Age",0);
-
mGrade=PlayerPrefs.GetFloat("Grade",0F);
//清除所有记录
PlayerPrefs.DeleteAll();
//删除其中某一条记录
PlayerPrefs.DeleteKey("Age");
//将记录写入磁盘
PlayerPrefs.Save()
第二种 BinaryFormatter 二进制序列化
假设有一个Player类
-
[System. Serializable]
-
public class Player
-
{
-
public int health;
-
public int power;
-
public Vector3 position;
-
}
由于BinaryFormatter序列化不支持Unity的Vector3类型,所以我们需要做一下包装。
-
public class PlayerData{
-
-
public int level;
-
public int health;
-
public float[] position;
-
-
public PlayerData(Player player)
-
{
-
this.level = player.level;
-
this.health = player.health;
-
this.position = new float[3];
-
this.position[0] = player.transform.position.x;
-
this.position[1] = player.transform.position.y;
-
this.position[2] = player.transform.position.z;
-
}
-
}
我们对PlayerData进行保存和读取。读取出来的PlayerData可以赋给Player。
-
public static class SaveSystem{
-
//保存数据
-
public static void SavePlayer(Player player)
-
{
-
BinaryFormatter formatter = new BinaryFormatter();
-
string path = Application.persistentDataPath+"/player.fun";
-
FileStream stream = new FileStream(path,FileMode.Create);
-
PlayerData data = new PlayerData(player);
-
formatter.Serialize(stream,data);
-
stream.Close();
-
}
-
-
//读取数据
-
public static PlayerData LoadPlayer()
-
{
-
string path = Application.persistentDataPath+"/player.fun";
-
if(File.Exists(path))
-
{
-
BinaryFormatter formatter = new BinaryFormatter();
-
FileStream stream = new FileStream(path,FileMode.Open);
-
PlayerData data = formatter.Deserialize(stream) as PlayerData;
-
stream.Close();
-
return data;
-
}else{
-
Debug.LogError("Save file not found in "+path);
-
return null;
-
}
-
}
-
}
第三种 保存为json格式的文本文件
使用 Unity 自身API JsonUtility。
保存数据
-
public static void SavePlayerJson(Player player)
-
{
-
string path = Application.persistentDataPath+"/player.json";
-
var content = JsonUtility.ToJson(player,true);
-
File.WriteAllText(path,content);
-
}
读取数据
-
public static PlayerData LoadPlayerJson()
-
{
-
string path = Application.persistentDataPath+"/player.json";
-
if(File.Exists(path)){
-
var content = File.ReadAllText(path);
-
var playerData = JsonUtility.FromJson<PlayerData>(content);
-
return playerData;
-
}else{
-
Debug.LogError("Save file not found in "+path);
-
return null;
-
}
-
}
第四种 XmlSerializer进行串行化
假如有类
-
public class Entity
-
{
-
public Entity()
-
{
-
}
-
public Entity(string c, string f)
-
{
-
name = c;
-
school = f;
-
}
-
public string name;
-
public string school;
-
}
读取数据
-
List<Entity> entityList=null;
-
XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
-
using (StreamReader sr = new StreamReader(configPath))
-
{
-
entityList = xs.Deserialize(sr) as List<Entity>;
-
}
保存数据
-
List<Entity> entityList=null;
-
XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
-
using (StreamWriter sw = File.CreateText(configPath))
-
{
-
xs.Serialize(sw, entityList);
-
}
对应的xml文件为:
-
<?xml version="1.0" encoding="utf-8"?>
-
<ArrayOfEntity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
<Entity>
-
<Name>Alice</Name>
-
<School>SJTU</School>
-
</Entity>
-
<Entity>
-
<Name>Cici</Name>
-
<School>CSU</School>
-
</Entity>
-
<Entity>
-
<Name>Zero</Name>
-
<School>HIT</School>
-
</Entity>
-
</ArrayOfEntity>
Unity3D 本地数据持久化几种方式的更多相关文章
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- iOS --- UIWebView的加载本地数据的三种方式
UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIM ...
- 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 ...
- python爬虫---爬虫的数据解析的流程和解析数据的几种方式
python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...
- Solr 删除数据的几种方式
原文出处:http://blog.chenlb.com/2010/03/solr-delete-data.html 有时候需要删除 Solr 中的数据(特别是不重做索引的系统中,在重做索引期间).删除 ...
- SparkStreaming获取kafka数据的两种方式:Receiver与Direct
简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...
- SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式
SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...
- 【代码笔记】iOS-向服务器传JSON数据的两种方式
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- .NET MVC控制器向视图传递数据的四种方式
.NET MVC控制器向视图传递数据的四种方式: 1.ViewBag ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...
随机推荐
- Nifi:初识nifi
写在前面: 第一次接触这一系统的时候,只有github上的一坨源码和官方的英文文档,用起来只能说是一步一个坑,一踩一个脚印,现在回想那段血泪史,只想 ***,现在用起来算是有了一些经验和总结,这里就做 ...
- mouseenter mouseleave鼠标悬浮离开事件
- 在微信框架模块中,基于Vue&Element前端的事件和内容的管理
在微信后台管理中,我们需要定义好菜单对应的事件管理,因为微信通过菜单触发相关的事件,因此菜单事件的响应关系,我们如果处理好,就能构建出我们的微信应用入口了.通过入口,我们可以响应用户菜单的事件,如响应 ...
- Linux中169.254.0.0/24的路由来自哪里
在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中.但是并不知道这条路由具有什么功能和它到底来自于哪里? [root@master01 ~]# ro ...
- [刷题] 349 Intersection of Two Arrays
查找问题 查找有无(只有键) 元素'a'是否存在 set(集合) 查找对应关系(键值对应) 元素'a'出现了几次 map(字典) set和map的底层实现是红黑树 常见操作 insert() find ...
- Python 送你一棵圣诞树
Python 送你一棵圣诞树 2019-01-02阅读 8800 今天是圣诞节,先祝大家圣诞快乐!??? 有人要说了,圣诞节是耶稣诞生的日子,我又不信基督教,有啥好庆祝的.这你就有所不知了,Pyt ...
- 搭建LNMP环境部署Wordpress博客
!!!首先要做的就是关闭系统的防火墙以及selinux: #systemctl stop firewalld #systemctl disable firewalld #sed -ri 's/^(SE ...
- Linux服务之nginx服务篇五(静态/动态文件缓存)
一.nginx实现静态文件缓存实战 1.nginx静态文件缓存 如果要熟练使用nginx来实现文件的缓存,那下面的几个指令你必须要牢记于心 (1)指令1:proxy_cache_path 作用:设置缓 ...
- C语言中位运算异或“∧”的作用
1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算 ...
- IEEE 网址
https://ieeexplore.ieee.org/document/506397