1、数据持久化
文章目录
概念
将【变量数据】在内存和硬盘之间的存储或读取
内容
PlayerPrefs的基本方法
PlayerPrefs在不同平台的存储位置
利用反射结合PlayerPrets制作通用存诸工具
PlayerPrefs基本方法
1、PlayerPrefs概念
是unity提供的可以用于存储读取玩家数据的公共类
2、存储相关
PlaverPrefs的数据存储类似于键值对存储一个键对应一个值
提供了存储3种数据的方法int float string
键:string类型
值:int float string对应3种API
PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myHeight", 183.5f);
PlayerPrefs.SetString("myName", "姓名");
PlayerPrefs.Save();
bool sex = true; //sex若为true存1,sex若为flase则存1
PlayerPrefs.SetInt("sex", sex ? 1 : 0);
如果用同一个键名,会进行覆盖
PlayerPrefs.SetFloat("myAge", 18.3f);
//键名是唯一的
3、读取相关
Set之后也能读取信息,读取顺序为:内存 > 硬盘
1、int
int age = PlayerPrefs.GetInt("myAge");
print(age); //0 被覆盖
age = PlayerPrefs.GetInt("myAge", 18); //18 设置的初始默认值
print(age);
2、float
float height = PlayerPrefs.GetFloat("myHeight", 100f);
print(height);
3、string
string name = PlayerPrefs.GetString("myName");
print(name);
是否存在的键名
if (PlayerPrefs.HasKey("myName"))
{
print("存在myName对应的键值对数据");
}
4、删除数据
删除指定键值对
PlayerPrefs.DeleteKey("myAge");
删除所有
PlayerPrefs.DeleteAll();
思考 信息的存储和读取
玩家信息类,装备信息类
用List存储装备信息
添加标识,存储多个玩家信息
将信息存储读取
using System.Collections.Generic;
using UnityEngine;
public class Item
{
public int id;
public int num;
}
public class Player
{
public string name;
public int age;
public int atk;
public int def;
public List<Item> itemList;
//用于存储或读取的标识
private string keyName;
/// <summary>
/// 存储数据
/// </summary>
public void Save()
{
PlayerPrefs.SetString(keyName + "_name", name);
PlayerPrefs.SetInt(keyName + "_age", age);
PlayerPrefs.SetInt(keyName + "_atk", atk);
PlayerPrefs.SetInt(keyName + "_def", def);
PlayerPrefs.SetInt(keyName + "_ItemNum", itemList.Count);
for (int i = 0; i < itemList.Count; i++)
{
PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);
PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);
}
PlayerPrefs.Save();
}
/// <summary>
/// 读取数据
/// </summary>
public void Load(string keyName)
{
//记录传入的标识
this.keyName = keyName;
name = PlayerPrefs.GetString(keyName + "_name", "未命名");
age = PlayerPrefs.GetInt(keyName + "_age", 18);
atk = PlayerPrefs.GetInt(keyName + "_atk", 20);
def = PlayerPrefs.GetInt(keyName + "_def", 2);
//获取数量
int num = PlayerPrefs.GetInt(keyName + "_ItemNum", 0);
//初始化容器
itemList = new List<Item>();
Item item;
for (int i = 0; i < num; i++)
{
item = new Item();
item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);
item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);
itemList.Add(item);
}
}
}
public class Test1_Exercises : MonoBehaviour
{
void Start()
{
Player p = new Player();
p.Load();
//print(p.name);
//print(p.age);
//print(p.atk);
//print(p.def);
print("不同类型道具数量:"+p.itemList.Count);
for (int i = 0; i < p.itemList.Count; i++)
{
print("道具id:" + p.itemList[i].id);
print("道具数量:" + p.itemList[i].num);
}
Item item = new Item();
item.id = 1;
item.num = 99;
p.itemList.Add(item);
item = new Item();
item.id = 2;
item.num = 99;
p.itemList.Add(item);
p.Save();
//其他玩家
Player p2 = new Player();
p2.Load("Player2");
p2.Save();