【Unity】几种客户端常用保存数据的做法

客户端数据保存探索

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

留个坑之后再填……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值