Unity带有时效性的数据存储

Unity带有时效性的数据存储

引言

在Unity项目开发中,有时候会遇到带有时效性的数据存储,比如账号信息、token等,都是具有时效性的,这时候我们就需要在这些信息过期的时候将对应的信息作废。

实现

这个功能怎么实现呢,还是利用Unity自带的PlayerPrefs功能来存储数据,只是在存储的时候,如果数据有时效性,我们需要给数据再存储一个对应的key值来记录时间。获取数据的时候,如果数据有时效性,我们判断对应的时间戳来判定数据的有效性。

完整代码

using System;
using UnityEngine;

/// 
/// 本地数据缓存
/// Playerprefs的封装
/// 
public class LocalCache
{
    /// 
    /// 时间戳结尾
    /// 
    public const string TimeEnd = "_TIMEEND";

    /// 
    /// 获取缓存的string数据
    /// 
    /// 
    /// 返回结果可能为空
    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);
        }
    }

    /// 
    /// 存储string
    /// 
    /// 
    /// 
    /// 小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)
    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());
        }
    }

    /// 
    /// 获取缓存的string数据
    /// 
    /// 
    /// 返回结果可能为空
    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);
        }
    }

    /// 
    /// 存储string
    /// 
    /// 
    /// 
    /// 小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)
    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());
        }
    }


    /// 
    /// 获取缓存的string数据
    /// 
    /// 
    /// 返回结果可能为空
    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);
        }
    }

    /// 
    /// 存储string
    /// 
    /// 
    /// 
    /// 小于等于0表示永久存储,其他表示有存储时间,单位毫秒(ms)
    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());
        }
    }

    /// 
    /// 获取当前时间的时间戳
    /// 
    /// 
    public static double CurrentTime()
    {
        return (DateTime.Now - new DateTime(1970, 1, 1)).TotalMilliseconds;
    }
}


尾语

这里实现的只是个小功能,但是平时多记录一些这种小功能,可以减少正式项目开发中的很多时间,毕竟这种小功能从开发到测试还是需要不少时间的。

如果有些的不对的地方,欢迎各位大佬批评指正。

你可能感兴趣的:(Unity,unity,游戏引擎)