Unity带有时效性的数据存储
Unity带有时效性的数据存储
引言
在Unity项目开发中,有时候会遇到带有时效性的数据存储,比如账号信息、token等,都是具有时效性的,这时候我们就需要在这些信息过期的时候将对应的信息作废。
实现
这个功能怎么实现呢,还是利用Unity自带的PlayerPrefs功能来存储数据,只是在存储的时候,如果数据有时效性,我们需要给数据再存储一个对应的key值来记录时间。获取数据的时候,如果数据有时效性,我们判断对应的时间戳来判定数据的有效性。
完整代码
using System;
using UnityEngine;/// <summary>
/// 本地数据缓存
/// Playerprefs的封装
/// </summary>
public class LocalCache
{/// <summary>/// 时间戳结尾/// </summary>public const string TimeEnd = "_TIMEEND";/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static string GetString(string key){string timeKey = key + TimeEnd;if (PlayerPrefs.HasKey(timeKey)){long time = long.Parse(PlayerPrefs.GetString(timeKey));if (CurrentTime() > time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetString(key);}}else{return PlayerPrefs.GetString(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetString(string key, string value, int time = -1){PlayerPrefs.SetString(key, value);if (time > 0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime = CurrentTime();long endTime = (long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static int? GetInt(string key){string timeKey = key + TimeEnd;if (PlayerPrefs.HasKey(timeKey)){long time = long.Parse(PlayerPrefs.GetString(timeKey));if (CurrentTime() > time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetInt(key);}}else{return PlayerPrefs.GetInt(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetInt(string key, int value, int time = -1){PlayerPrefs.SetInt(key, value);if (time > 0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime = CurrentTime();long endTime = (long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取缓存的string数据/// </summary>/// <param name="key"></param>/// <returns>返回结果可能为空</returns>public static float? GetFloat(string key){string timeKey = key + TimeEnd;if (PlayerPrefs.HasKey(timeKey)){long time = long.Parse(PlayerPrefs.GetString(timeKey));if (CurrentTime() > time){//信息过期作废PlayerPrefs.DeleteKey(key);PlayerPrefs.DeleteKey(timeKey);return null;}else{return PlayerPrefs.GetFloat(key);}}else{return PlayerPrefs.GetFloat(key);}}/// <summary>/// 存储string/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="time">小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)</param>public static void SetFloat(string key, float value, int time = -1){PlayerPrefs.SetFloat(key, value);if (time > 0){//存储对应的时间戳string timeKey = key + TimeEnd;double currentTime = CurrentTime();long endTime = (long)(currentTime + time);PlayerPrefs.SetString(timeKey, endTime.ToString());}}/// <summary>/// 获取当前时间的时间戳/// </summary>/// <returns></returns>public static double CurrentTime(){return (DateTime.Now - new DateTime(1970, 1, 1)).TotalMilliseconds;}
}
尾语
这里实现的只是个小功能,但是平时多记录一些这种小功能,可以减少正式项目开发中的很多时间,毕竟这种小功能从开发到测试还是需要不少时间的。
如果有些的不对的地方,欢迎各位大佬批评指正。