当前位置: 首页 > 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;队列只有…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...