当前位置: 首页 > news >正文

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项目开发中&#xff0c;有时候会遇到带有时效性的数据存储&#xff0c;比如账号信息、token等&#xff0c;都是具有时效性的&#xff0c;这时候我们就需要在这些信息过期的时候将对应的信息作废。 实现 这个功能怎么实现呢&#xff…...

vue 子组件 emit传递事件和事件数据给父组件

1 子组件通过emit 函数 传递事件名init-complete 和 数据dateRange this.$emit(init-complete, dateRange) 2 父组件 创建方法 接收数据 handleInitComplete(dateRange) {} 3 父组件 创建的方法 和 子组件事件绑定 <component :is"currentComponent" :passOb…...

Zenity 简介

什么使 Zenity Zenity 是一个开源的命令行工具&#xff0c;它提供了一种简单的方式来创建图形化的用户界面&#xff08;GUI&#xff09;对话框&#xff0c;以与用户进行交互。它基于 GTK 库&#xff0c;可以在 Linux 和其他 UNIX-like 系统上使用。 Zenity 可以通过命令行或脚…...

c# 数组反转

一个数组是{1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6}&#xff0c;把它变成{6&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1} 1.创建一个和原数组长度类型一样的数组来接收反转的数据 private static void Main(string[] a…...

CSS学习笔记01

CSS笔记01 什么是CSS CSS&#xff08;Cascading Style Sheets &#xff09;&#xff1a;层叠样式表&#xff0c;也可以叫做级联样式表&#xff0c;是一种用来表现 HTML 或 XML 等文件样式的计算机语言。字体&#xff0c;颜色&#xff0c;边距&#xff0c;高度&#xff0c;宽度…...

数据结构,队列,顺序表队列,链表队列

队列是一种常见的数据结构&#xff0c;它具有先进先出&#xff08;First-In-First-Out&#xff0c;FIFO&#xff09;的特性&#xff0c;类似于排队等候的场景。以下是队列的要点&#xff1a; 1. 定义&#xff1a;队列是一种线性数据结构&#xff0c;由一系列元素组成&#xff…...

Webgl利用缓冲区绘制三角形

什么是attribute 变量 它是一种存储限定符&#xff0c;表示定义一个attribute的全局变量&#xff0c;这种变量的数据将由外部向顶点着色器内传输&#xff0c;并保存顶点相关的数据&#xff0c;只有顶点着色器才能使用它 <!DOCTYPE html> <html lang"en"&g…...

正则表达式应用

正则表达式应用 正则匹配以{开头&#xff0c;以}结尾 \{.*?\}正则匹配以[开头&#xff0c;以]结尾 \[.*?\]校验数字的表达式 数字&#xff1a;^[0-9]*$n位的数字&#xff1a;^\d{n}$至少n位的数字&#xff1a;^\d{n,}$m-n位的数字&#xff1a;^\d{m,n}$零和非零开头的数字…...

9.4 【C语言】用指针处理链表

9.4.1 什么是链表 它是动态地进行存储分配的一种结构。 链表中各元素在内存中的地址是不连续的。要找某一元素&#xff0c;必须先找到上一个元素&#xff0c;根据它提供的下一元素地址才能找到下一个元素。 如果不提供“头指针”&#xff0c;则整个链表无法访问。 9.4.2 建…...

后端面试话术集锦第四篇:rabbitmq面试话术

🚗后端面试集锦目录 💖后端面试话术集锦第一篇:spring面试话术💖 💖后端面试话术集锦第二篇:spring boot面试话术💖 💖后端面试话术集锦第三篇:spring cloud面试话术💖 💖后端面试话术集锦第四篇:ElasticSearch面试话术💖 💖后端面试话术集锦第五篇:r…...

Linux目录结构与文件管理(01) (三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Linux 系统的组成 二、目录结构 根目录 三、文件管理 目录管理 总结 前言 今天主要学习了Linux的目录结构&#xff0c;主要是一些命令的含义和用法&am…...

OpenCV为老照片,黑白照片增加色彩

Colorful Image Colorization 图片的颜色上色&#xff0c;主要使用到了CNN卷积神经网络&#xff0c;作者在ImageNet数据集上进行了大量的训练&#xff0c;并将此问题使用在分类任务中&#xff0c;以解决问题的潜在的不确定性&#xff0c;并在训练时使用颜色重新平衡的损失函数方…...

HTML之VSCode简单配置与创建

目录 插件下载 然后输入源码&#xff1a; 使用 效果 插件下载 下载这个插件后可以直接运行&#xff1a; 然后创建一个文件&#xff1a; 然后输入源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...

2023亿发一体化新零售POS收银解决方案,打造连锁门店经营新未来

在零售业不断演变的今天&#xff0c;门店形态繁多&#xff0c;收银环节的共通性与差异性并存。传统的通用解决方案已不适应多样化的业态需求&#xff0c;而在线上线下一体化的时代背景下&#xff0c;全渠道经营能力也成为商家的迫切需求。 一体化新零售POS收银系统&#xff0c…...

Android ---使用Jenkins 打包release版本不能安装或者安装后不显示APP

大家在用 Jenkins的时候&#xff0c;是不是会觉得很爽&#xff0c;因为他在用的过程中&#xff0c;是无脑的&#xff0c;毕竟一键触发&#xff01;&#xff01;&#xff01;&#xff01; 这边记录一个昨天&#xff0c;今天遇到的一个坑货问题&#xff0c;别人提交了所有代码&am…...

【Spring】什么是 AOP(面向切面编程) ? 为什么要有 AOP ? 如何实现 Spring AOP ?

文章目录 前言一、什么是 AOP ?二、为什么要使用 AOP ?三、 AOP 的组成四、Spring AOP 的实现1, 添加依赖2, 定义切面3, 定义切点4, 定义通知5, 创建连接点 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法…...

11.并发:自旋锁

原子操作和自旋锁的区别 相同点都是保护共享资源。 不同点在于&#xff1a; 原子操作简单易用&#xff0c;但只能做计数操作&#xff0c;保护的东西太少。 自旋锁主要用于多核处理器。短时期的轻量级加锁&#xff0c;加锁失败时原地打转、忙等待。避免了上下文调度和系统开销较…...

使用EF Core更新与修改生产数据库

使用EF Core的Code First&#xff0c;在设计阶段&#xff0c;直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据&#xff0c;删除的风险非常低。但是对于已经投入生产的数据库&#xff0c;这个方法就绝对不可行了。 考虑…...

法律小程序开发:让法律咨询更便捷

在现代社会&#xff0c;法律咨询服务越来越受到人们的重视和需求。为了方便用户预约法律咨询&#xff0c;很多律所都开始使用小程序来提供在线预约服务。那么&#xff0c;如何制作一款律所预约小程序呢&#xff1f; 首先&#xff0c;我们可以选择乔拓云网作为制作小程序的平台。…...

【C++多线程】C++11互斥锁和条件变量实现生产者消费者模型

先看几个问题&#xff0c;第三个问题可以先看代码然后再理解 Q1&#xff1a;临界区在哪 A1: 队列中元素在「生产者生产&#xff08;push&#xff09;」和「消费者消费&#xff08;pop&#xff09;」时就是临界区 Q2&#xff1a;同步操作在哪 A2: 很显然&#xff0c;队列只有…...

为什么选择BetterNCM:5个实用技巧让你的网易云音乐焕然一新

为什么选择BetterNCM&#xff1a;5个实用技巧让你的网易云音乐焕然一新 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要解锁网易云音乐隐藏功能&#xff0c;让听歌体验更上一层楼吗…...

YOLOv8 室内行人跌倒数据集信息表

YOLOv8 室内行人跌倒数据集信息表 数据集概述 项目内容数据集名称YOLOv8 室内行人跌倒数据集总图像数量9,262 张应用场景跌倒检测、公共安全监控、老年人护理、智能安防目标类别2 类&#xff1a;stand&#xff08;站立&#xff09;、fall&#xff08;跌倒&#xff09;标注格式…...

终极指南:如何用dnSpyEx完美调试和编辑.NET 8程序集

终极指南&#xff1a;如何用dnSpyEx完美调试和编辑.NET 8程序集 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 在当今快速发展的.NET生态中&#xff0c;…...

自动化技能备份库的安全分析与工程实践指南

1. 项目概述与核心定位最近在整理一些自动化工具和脚本时&#xff0c;我又翻出了这个叫openclaw/skills的仓库。这其实是一个挺有意思的“数字档案馆”&#xff0c;它的主要作用是把一个特定平台上的“技能”&#xff08;Skills&#xff09;给备份下来。简单来说&#xff0c;你…...

ARM GICv3中断控制器与ICC_CTLR寄存器详解

1. ARM GICv3中断控制器概述在ARM架构的嵌入式系统中&#xff0c;通用中断控制器(GIC)是管理硬件中断请求的核心组件。GICv3作为当前主流的版本&#xff0c;相比前代架构进行了多项重要改进&#xff0c;其中CPU接口寄存器组的增强尤为显著。作为系统开发者&#xff0c;深入理解…...

Logisim-evolution终极指南:从数字电路新手到硬件设计高手

Logisim-evolution终极指南&#xff1a;从数字电路新手到硬件设计高手 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 你是否曾经对计算机内部的奥秘感到好奇&#xff1f…...

Ai小程序入门00-初识AI编程(小白入门:不懂代码也能做小程序?AI编程到底怎么玩)

Ai小程序入门00-初识AI编程(小白入门:不懂代码也能做小程序?AI编程到底怎么玩) 📌 文章简介:很多人都有一个"做个小程序赚钱"或"实现自己创意"的梦想,但往往被复杂的代码、繁琐的环境配置劝退。如今,AI 编程工具(如 Cursor、Claude 等)彻底改变…...

边缘AI推理芯片选型指南:从吞吐量到延迟的实战评估

1. 从数据中心到边缘&#xff1a;AI推理范式的根本性转变如果你正在为你的下一个AI项目选型硬件&#xff0c;尤其是在考虑将模型部署到摄像头、汽车或者医疗设备上&#xff0c;那么“边缘AI推理”这个词你一定不陌生。但很多人&#xff0c;包括一些经验丰富的工程师&#xff0c…...

无线TDoA定位中的硬件偏差问题与DTB校准方法

1. 无线TDoA定位中的硬件偏差问题解析在无线定位领域&#xff0c;时间差到达&#xff08;Time Difference of Arrival, TDoA&#xff09;技术因其能够消除接收机时钟偏差而备受青睐。然而&#xff0c;这项技术在实际应用中面临一个关键挑战&#xff1a;节点硬件引入的系统性偏差…...

杰理之做1T1应用失真较大问题修改【篇】

可以将低延时编码LIVE_AUDIO_CODING_JLA_LL修改为LIVE_AUDIO_CODING_JLA...