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;}
}
尾语
这里实现的只是个小功能,但是平时多记录一些这种小功能,可以减少正式项目开发中的很多时间,毕竟这种小功能从开发到测试还是需要不少时间的。
如果有些的不对的地方,欢迎各位大佬批评指正。
相关文章:
Unity带有时效性的数据存储
Unity带有时效性的数据存储 引言 在Unity项目开发中,有时候会遇到带有时效性的数据存储,比如账号信息、token等,都是具有时效性的,这时候我们就需要在这些信息过期的时候将对应的信息作废。 实现 这个功能怎么实现呢ÿ…...
vue 子组件 emit传递事件和事件数据给父组件
1 子组件通过emit 函数 传递事件名init-complete 和 数据dateRange this.$emit(init-complete, dateRange) 2 父组件 创建方法 接收数据 handleInitComplete(dateRange) {} 3 父组件 创建的方法 和 子组件事件绑定 <component :is"currentComponent" :passOb…...
Zenity 简介
什么使 Zenity Zenity 是一个开源的命令行工具,它提供了一种简单的方式来创建图形化的用户界面(GUI)对话框,以与用户进行交互。它基于 GTK 库,可以在 Linux 和其他 UNIX-like 系统上使用。 Zenity 可以通过命令行或脚…...
c# 数组反转
一个数组是{1,2,3,4,5,6},把它变成{6,5,4,3,2,1} 1.创建一个和原数组长度类型一样的数组来接收反转的数据 private static void Main(string[] a…...
CSS学习笔记01
CSS笔记01 什么是CSS CSS(Cascading Style Sheets ):层叠样式表,也可以叫做级联样式表,是一种用来表现 HTML 或 XML 等文件样式的计算机语言。字体,颜色,边距,高度,宽度…...
数据结构,队列,顺序表队列,链表队列
队列是一种常见的数据结构,它具有先进先出(First-In-First-Out,FIFO)的特性,类似于排队等候的场景。以下是队列的要点: 1. 定义:队列是一种线性数据结构,由一系列元素组成ÿ…...
Webgl利用缓冲区绘制三角形
什么是attribute 变量 它是一种存储限定符,表示定义一个attribute的全局变量,这种变量的数据将由外部向顶点着色器内传输,并保存顶点相关的数据,只有顶点着色器才能使用它 <!DOCTYPE html> <html lang"en"&g…...
正则表达式应用
正则表达式应用 正则匹配以{开头,以}结尾 \{.*?\}正则匹配以[开头,以]结尾 \[.*?\]校验数字的表达式 数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字…...
9.4 【C语言】用指针处理链表
9.4.1 什么是链表 它是动态地进行存储分配的一种结构。 链表中各元素在内存中的地址是不连续的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。 如果不提供“头指针”,则整个链表无法访问。 9.4.2 建…...
后端面试话术集锦第四篇:rabbitmq面试话术
🚗后端面试集锦目录 💖后端面试话术集锦第一篇:spring面试话术💖 💖后端面试话术集锦第二篇:spring boot面试话术💖 💖后端面试话术集锦第三篇:spring cloud面试话术💖 💖后端面试话术集锦第四篇:ElasticSearch面试话术💖 💖后端面试话术集锦第五篇:r…...
Linux目录结构与文件管理(01) (三)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Linux 系统的组成 二、目录结构 根目录 三、文件管理 目录管理 总结 前言 今天主要学习了Linux的目录结构,主要是一些命令的含义和用法&am…...
OpenCV为老照片,黑白照片增加色彩
Colorful Image Colorization 图片的颜色上色,主要使用到了CNN卷积神经网络,作者在ImageNet数据集上进行了大量的训练,并将此问题使用在分类任务中,以解决问题的潜在的不确定性,并在训练时使用颜色重新平衡的损失函数方…...
HTML之VSCode简单配置与创建
目录 插件下载 然后输入源码: 使用 效果 插件下载 下载这个插件后可以直接运行: 然后创建一个文件: 然后输入源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...
2023亿发一体化新零售POS收银解决方案,打造连锁门店经营新未来
在零售业不断演变的今天,门店形态繁多,收银环节的共通性与差异性并存。传统的通用解决方案已不适应多样化的业态需求,而在线上线下一体化的时代背景下,全渠道经营能力也成为商家的迫切需求。 一体化新零售POS收银系统,…...
Android ---使用Jenkins 打包release版本不能安装或者安装后不显示APP
大家在用 Jenkins的时候,是不是会觉得很爽,因为他在用的过程中,是无脑的,毕竟一键触发!!!! 这边记录一个昨天,今天遇到的一个坑货问题,别人提交了所有代码&am…...
【Spring】什么是 AOP(面向切面编程) ? 为什么要有 AOP ? 如何实现 Spring AOP ?
文章目录 前言一、什么是 AOP ?二、为什么要使用 AOP ?三、 AOP 的组成四、Spring AOP 的实现1, 添加依赖2, 定义切面3, 定义切点4, 定义通知5, 创建连接点 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法…...
11.并发:自旋锁
原子操作和自旋锁的区别 相同点都是保护共享资源。 不同点在于: 原子操作简单易用,但只能做计数操作,保护的东西太少。 自旋锁主要用于多核处理器。短时期的轻量级加锁,加锁失败时原地打转、忙等待。避免了上下文调度和系统开销较…...
使用EF Core更新与修改生产数据库
使用EF Core的Code First,在设计阶段,直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据,删除的风险非常低。但是对于已经投入生产的数据库,这个方法就绝对不可行了。 考虑…...
法律小程序开发:让法律咨询更便捷
在现代社会,法律咨询服务越来越受到人们的重视和需求。为了方便用户预约法律咨询,很多律所都开始使用小程序来提供在线预约服务。那么,如何制作一款律所预约小程序呢? 首先,我们可以选择乔拓云网作为制作小程序的平台。…...
【C++多线程】C++11互斥锁和条件变量实现生产者消费者模型
先看几个问题,第三个问题可以先看代码然后再理解 Q1:临界区在哪 A1: 队列中元素在「生产者生产(push)」和「消费者消费(pop)」时就是临界区 Q2:同步操作在哪 A2: 很显然,队列只有…...
为什么选择BetterNCM:5个实用技巧让你的网易云音乐焕然一新
为什么选择BetterNCM:5个实用技巧让你的网易云音乐焕然一新 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要解锁网易云音乐隐藏功能,让听歌体验更上一层楼吗…...
YOLOv8 室内行人跌倒数据集信息表
YOLOv8 室内行人跌倒数据集信息表 数据集概述 项目内容数据集名称YOLOv8 室内行人跌倒数据集总图像数量9,262 张应用场景跌倒检测、公共安全监控、老年人护理、智能安防目标类别2 类:stand(站立)、fall(跌倒)标注格式…...
终极指南:如何用dnSpyEx完美调试和编辑.NET 8程序集
终极指南:如何用dnSpyEx完美调试和编辑.NET 8程序集 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 在当今快速发展的.NET生态中,…...
自动化技能备份库的安全分析与工程实践指南
1. 项目概述与核心定位最近在整理一些自动化工具和脚本时,我又翻出了这个叫openclaw/skills的仓库。这其实是一个挺有意思的“数字档案馆”,它的主要作用是把一个特定平台上的“技能”(Skills)给备份下来。简单来说,你…...
ARM GICv3中断控制器与ICC_CTLR寄存器详解
1. ARM GICv3中断控制器概述在ARM架构的嵌入式系统中,通用中断控制器(GIC)是管理硬件中断请求的核心组件。GICv3作为当前主流的版本,相比前代架构进行了多项重要改进,其中CPU接口寄存器组的增强尤为显著。作为系统开发者,深入理解…...
Logisim-evolution终极指南:从数字电路新手到硬件设计高手
Logisim-evolution终极指南:从数字电路新手到硬件设计高手 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 你是否曾经对计算机内部的奥秘感到好奇?…...
Ai小程序入门00-初识AI编程(小白入门:不懂代码也能做小程序?AI编程到底怎么玩)
Ai小程序入门00-初识AI编程(小白入门:不懂代码也能做小程序?AI编程到底怎么玩) 📌 文章简介:很多人都有一个"做个小程序赚钱"或"实现自己创意"的梦想,但往往被复杂的代码、繁琐的环境配置劝退。如今,AI 编程工具(如 Cursor、Claude 等)彻底改变…...
边缘AI推理芯片选型指南:从吞吐量到延迟的实战评估
1. 从数据中心到边缘:AI推理范式的根本性转变如果你正在为你的下一个AI项目选型硬件,尤其是在考虑将模型部署到摄像头、汽车或者医疗设备上,那么“边缘AI推理”这个词你一定不陌生。但很多人,包括一些经验丰富的工程师,…...
无线TDoA定位中的硬件偏差问题与DTB校准方法
1. 无线TDoA定位中的硬件偏差问题解析在无线定位领域,时间差到达(Time Difference of Arrival, TDoA)技术因其能够消除接收机时钟偏差而备受青睐。然而,这项技术在实际应用中面临一个关键挑战:节点硬件引入的系统性偏差…...
杰理之做1T1应用失真较大问题修改【篇】
可以将低延时编码LIVE_AUDIO_CODING_JLA_LL修改为LIVE_AUDIO_CODING_JLA...
