客户端数据保存探索
PlayerPrefs
对于一般不太重要的数据,将其保存在PlayerPrefs是一种最简单有效的方式,其可以支持的数据类型为:string,int,float,可采用如下方式进行调用:
//数据保存
PlayerPrefs.SetInt("Score", 100);
PlayerPrefs.SetFloat("Health", 90.5f);
PlayerPrefs.SetString("PlayerName", "JohnDoe");
//数据读取
int score = PlayerPrefs.GetInt("Score", 0); // 如果"Score"不存在,则返回0
float health = PlayerPrefs.GetFloat("Health", 100.0f); // 如果"Health"不存在,则返回100.0f
string playerName = PlayerPrefs.GetString("PlayerName", "Guest"); // 如果"PlayerName"不存在,则返回"Guest"
//删除数据
PlayerPrefs.DeleteKey("Score"); // 删除"Score"键及其对应的值
PlayerPrefs.DeleteAll(); // 删除所有保存的数据
//判断key值是否存在
bool hasScore = PlayerPrefs.HasKey("Score"); // 如果"Score"键存在,则返回true;否则返回false
此种方式最大的特点是简单,但缺点是要给每个变量想一个独一无二的key,因为相同的key值会彼此覆盖 (即便是不同类型也不可以哦) ,因此一般用来保存一些与用户无关的数据,例如游戏音量、帧率、窗口分辨率等
使用Json文件保存
这种方式相比PlayerPrefs灵活度有了较大提升,开发者可以将玩家数据序列化成一个json字符串保存在玩家本地,等需要使用时再去调用一下,在unity中一般常用的Json库有JsonUtilty,其优势在于轻量化且Unity默认提供,但缺点是无法支持复杂类型数据(例如字典),并且不支持null类型(会将其转换成默认数据,例如int类型就转化成0,搞不懂为啥不支持一下呢?),但对于一般来说足够了,下面看一个例子:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class UserData
{
public string name;
public int level;
}
public class ConfigUtils
{
static char[] keyCode = { 'a', 'b' ,'c','d','e','f'};
static string Encrypt(string data)
{
char[] dataChars = data.ToCharArray();
for(int i=0;i<dataChars.Length;i++)
{
dataChars[i] ^= keyCode[i % keyCode.Length];
}
return new string(dataChars);
}
static string Decrypt(string data)
{
return Encrypt(data);
}
public static void SaveUserData(UserData ud)
{
if(!File.Exists(Application.persistentDataPath+"/users"))
{
Directory.CreateDirectory(Application.persistentDataPath + "/users");
}
string jsonStr = JsonUtility.ToJson(ud);
string path = Application.persistentDataPath + "/users/" + $"user_config_{ud.name}.json";
File.WriteAllText(path,Encrypt(jsonStr));
}
public static UserData LoadUserData(string name)
{
string path = Application.persistentDataPath + "/users/" + $"user_config_{name}.json";
if(File.Exists(path))
{
string rawStr = Decrypt(File.ReadAllText(path));
UserData ud = JsonUtility.FromJson<UserData>(rawStr);
return ud;
}
return null;
}
}
这段代码实现了将UserData储存在Application.persistentDataPath路径下,并实现了简单的数据加密功能对于一般应用足够了
使用Sqlite
留个坑之后再填……