Unity学习笔记--数据持久化之PlayerPrefs的使用
生活随笔
收集整理的這篇文章主要介紹了
Unity学习笔记--数据持久化之PlayerPrefs的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據持久化
PlayerPrefs相關
PlayerPrefs是Unity游戲引擎中的一個類,用于在游戲中存儲和訪問玩家的偏好設置和數據。它可以用來保存玩家的游戲進度、設置選項、最高分數等信息。PlayerPrefs將數據存儲在本地文件中,因此可以在游戲重新啟動時保持數據的持久性。
//PlayerPrefs的數據存儲 類似于鍵值對存儲 一個鍵對應一個值
//提供了存儲3種數據的方法 int float string
//鍵: string類型
//值:int float string 對應3種API
PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myHeight", 177.5f);
PlayerPrefs.SetString("myName", "TonyChang");
//直接調用Set相關方法 只會把數據存到內存里
//當游戲結束時 Unity會自動把數據存到硬盤中
//如果游戲不是正常結束的 而是崩潰 數據是不會存到硬盤中的
//只要調用該方法 就會馬上存儲到硬盤中
PlayerPrefs.Save();
//PlayerPrefs是有局限性的 它只能存3種類型的數據
//如果你想要存儲別的類型的數據 只能降低精度 或者上升精度來進行存儲
bool sex = true;
PlayerPrefs.SetInt("sex", sex ? 1 : 0);
//如果不同類型用同一鍵名進行存儲 會進行覆蓋
PlayerPrefs.SetFloat("myAge", 20.2f);
//注意 運行時 只要你Set了對應鍵值對
//即使你沒有馬上存儲Save在本地
//也能夠讀取出信息
//int
int age = PlayerPrefs.GetInt("myAge");
print(age);
//前提是 如果找不到myAge對應的值 就會返回函數的第二個參數 默認值
age = PlayerPrefs.GetInt("myAge", 100);
print(age);
//float
float height = PlayerPrefs.GetFloat("myHeight", 1000f);
print(height);
//string
string name = PlayerPrefs.GetString("myName");
print(name);
//第二個參數 默認值 對于我們的作用
//就是 在得到沒有的數據的時候 就可以用它來進行基礎數據的初始化
//判斷數據是否存在
if( PlayerPrefs.HasKey("myName") )
{
print("存在myName對應的鍵值對數據");
}
//刪除指定鍵值對
PlayerPrefs.DeleteKey("myAge");
//刪除所有存儲的信息
PlayerPrefs.DeleteAll();
PlayerPrefs中存儲的數據存儲在哪里?
PC端: PlayerPrefs 存儲在 HKCU\Software[公司名稱][產品名稱] 項下的注冊表中
其中公司和產品名稱是 在“Project Settings”中設置的名稱。
安卓: /data/data/包名/shared_prefs/pkg-name.xml
PlayerPrefs中數據的唯一性,PlayerPrefs中數據的唯一性是由key決定的,不同的key決定了不同的數據,同一個項目中如果不同數據key相同會造成數據丟失,要保證數據名稱命名的唯一性規則。
優點:使用簡單
缺點:存儲數據類型有限、安全性差(直接找到在設備上的存儲的位置查看設置)
PlayerPrefs存儲工具類:
為了方便進行數據的存儲,使用PlayerPrefs中進行存儲方法的設置的存取!
主要實現功能是數據的讀和數據的取~ 通過反射進行數據類型的獲取,利用PlayerPrefs進行數據存儲。
using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
namespace Framwork
{
/// <summary>
/// Playerprefs 存儲類
/// </summary>
public class PlayerPrefsManager
{
private static PlayerPrefsManager instance=new PlayerPrefsManager();
public static PlayerPrefsManager Instance => instance;
private PlayerPrefsManager()
{
}
/// <summary>
/// 存取數據的方法
/// </summary>
/// <param name="obj">數據實體</param>
/// <param name="name">數據名稱</param>
public void SaveData(object data, string keyName)
{
Type type = data.GetType();
FieldInfo[] infos = type.GetFields();
string tempKey="null";
FieldInfo tempInfo = null;
for (int i = 0; i < infos.Length; i++)
{
//獲取數據數據類型
tempInfo = infos[i];
Debug.Log("Types==="+tempInfo);
//類的名字+類的類型 + 數據內容名字+數據類型
//作為存儲的keyName鍵
tempKey = keyName + "_" + type.Name + "_" + tempInfo.Name
+ "_" + tempInfo.FieldType.Name;
SaveValue(tempInfo.GetValue(data),tempKey);
}
//進行值的獲取
//tempInfo.GetValue(data);
PlayerPrefs.Save();
}
/// <summary>
/// 讀取數據的類型
/// </summary>
/// <param name="type">要讀取的數據類型</param>
/// <param name="name">要讀取的數據名稱</param>
/// <returns>返回數據實體</returns>
public object LoadData(Type type, string name)
{
//獲取數據中的類型
FieldInfo[] infos = type.GetFields();
//創建存儲數據信息的實體
object data = Activator.CreateInstance(type);
string tempName = null;
FieldInfo tempInfo = null;
for (int i = 0; i < infos.Length; i++)
{
tempInfo = infos[i];//數據結構中的數據名稱
tempName = name + "_" + type.Name + "_" +tempInfo.Name+"_"
+tempInfo.FieldType.Name;//數據結構中的數據名稱類型
//裝載的容器 容器中的數據
//進行數據裝載
tempInfo.SetValue(data,LoadValue(tempInfo.FieldType,tempName));
}
return data;
}
/// <summary>
/// 進行具體的類型數據的存儲
/// </summary>
/// <param name="data"></param>
/// <param name="keyName"></param>
private void SaveValue(object value, string keyName)
{
Type fieldType = value.GetType();
if (fieldType == typeof(int))
{
Debug.Log("存儲int"+value);
PlayerPrefs.SetInt(keyName,(int)value);
}else if (fieldType == typeof(float))
{
Debug.Log("存儲float"+value);
PlayerPrefs.SetFloat(keyName,(float)value);
}else if (fieldType == typeof(string))
{
Debug.Log("存儲string"+value);
PlayerPrefs.SetString(keyName,value.ToString());
}
//對于List存儲的設置
//根據存儲的字段類型和IList是否是父子關系
else if(typeof(IList).IsAssignableFrom(fieldType))
{
//父類裝子類
IList list=value as IList;
//存儲元素數量
PlayerPrefs.SetInt(keyName,list.Count);
Debug.Log("存儲List長度為"+list.Count);
int index = 0;
foreach (var obj in list)
{
//存儲list列表中元素內容
//命名形式是 list名字+索引編號
//遞歸調用存儲
SaveValue(obj,keyName+index);
index++;
}
}else if (typeof(IDictionary).IsAssignableFrom(fieldType))
{
IDictionary dictionary = value as IDictionary;
//存儲數據個數
PlayerPrefs.SetInt(keyName,dictionary.Count);
Debug.Log("存儲Dic長度為"+dictionary.Count);
int index = 0;
foreach (var key in dictionary.Keys)
{
//存儲鍵
SaveValue(key,keyName+"_key_"+index);
//存儲值
SaveValue(dictionary[key],keyName+"_value_"+index);
index++;
}
}//自定義數據類型的存儲 進行解析
else
{
SaveData(value,keyName);
}
}
private object LoadValue(Type type, string name)
{
if (type == typeof(int))
{
return PlayerPrefs.GetInt(name,0);
}else if (type == typeof(float))
{
return PlayerPrefs.GetFloat(name,0.0f);
}else if (type == typeof(string))
{
return PlayerPrefs.GetString(name,"");
}else if (typeof(IList).IsAssignableFrom(type))
{
//讀取列表
int count = PlayerPrefs.GetInt(name);
IList tempList=Activator.CreateInstance(type) as IList;
for (int i = 0; i < count; i++)
{
//獲取List中存儲元素的類型 type.GetGenericArguments()[0]
tempList.Add(LoadValue(type.GetGenericArguments()[0],name+i));
}
return tempList;
}else if (typeof(IDictionary).IsAssignableFrom(type))
{
//進行對字典的讀取
int count = PlayerPrefs.GetInt(name);
IDictionary tempDictionary=Activator.CreateInstance(type) as IDictionary;
for (int i = 0; i < count; i++)
{
tempDictionary.Add(LoadValue(type.GetGenericArguments()[0], name + "_key_" + i),
LoadValue(type.GetGenericArguments()[1], name + "_value_" + i));
}
return tempDictionary;
}
else
{
//讀取自定義類成員的設置
return LoadData(type, name);
}
}
}
}
附:
測試腳本
using System.Collections.Generic;
using UnityEngine;
namespace Framwork
{
//注意:
//1 自定義數據結構類型中要有有效的無參構造函數
public class PlayerInfo
{
public int age;
public string name;
public float height;
public int sex;//0是女 1是男
public ItemInfo ItemInfo;
//list存儲測試
public List<int> list;
public Dictionary<int, string> dic;
}
public class ItemInfo
{
public int stu_no;//學號
public int stu_class;//班級
public ItemInfo()
{
}
public ItemInfo(int no,int classNo)
{
stu_no = no;
stu_class = classNo;
}
}
/// <summary>
/// 測試類
/// </summary>
public class TestPlayerPrefsTest:MonoBehaviour
{
private PlayerInfo playerInfo;
private PlayerInfo playerInfo1;
private void Start()
{
//讀取數據
playerInfo = new PlayerInfo();
// Type fieldType = playerInfo.GetType();
playerInfo.age = 18;
playerInfo.name = "TonyChang";
playerInfo.height = 175.8f;
playerInfo.sex = 1;
playerInfo.ItemInfo = new ItemInfo(2001, 2);
playerInfo.list = new List<int>(){1,5,6,8};
playerInfo.dic = new Dictionary<int, string>();
playerInfo.dic.Add(1,"Tony");
playerInfo.dic.Add(2,"Jeny");
playerInfo.dic.Add(3,"JayChou");
//進行數據保存
PlayerPrefsManager.Instance.SaveData(playerInfo,"Player1");
playerInfo1 = PlayerPrefsManager.Instance.LoadData(typeof(PlayerInfo), "Player1") as PlayerInfo;
Debug.Log("age=="+playerInfo1.age);
Debug.Log("name=="+playerInfo1.name);
Debug.Log("sex=="+playerInfo1.sex);
Debug.Log("List[1]=="+playerInfo1.list[1]);
Debug.Log("Dic[1]=="+playerInfo1.dic[1]);
}
}
}
總結
以上是生活随笔為你收集整理的Unity学习笔记--数据持久化之PlayerPrefs的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubernetes container
- 下一篇: DX后台截图C++实现代码