Unity为软件添加使用有效期的具体步骤
作者:CoderZ1010 发布时间:2022-07-01 16:45:03
标签:Unity,软件,使用有效期
功能需求:为软件设定一个使用有效期,当超过指定时间后,程序无法运行。
实现思路:定义一个常量,用于记录一个时间,我们称之为标记时间,使用当前时间减去标记时间,如果时间间隔大于设定的有效期,退出程序。
具体步骤:
1.定义标记时间常量:
//标记时间
private const string flag = "2022-03-17 17:11:25";
使用DateTime.Parse可将其转换为DateTime类型:
DateTime flagTime = DateTime.Parse(flag);
2.获取当前时间:
DateTime nowTime = DateTime.Now;
3.计算时间间隔:
TimeSpan span = nowTime - flagTime;
4.判断时间间隔是否大于有效期:
if (span.Days >= expires) Application.Quit();
但是这样这样实现会有一个问题,DateTime.Now获取的是本地计算机时间,如果用户故意修改计算机的时间,那么这个功能将无意义。
因此将获取当前时间的步骤修改为调用网络接口来获取时间,这里以如下这个接口为例:
https://apps.game.qq.com/CommArticle/app/reg/gdate.php
使用GET方式调用接口,代码如下:
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Example : MonoBehaviour
{
//标记时间
private const string flag = "2022-03-17 17:11:25";
//有效期 单位:天
private const int expires = 30;
private void Start()
{
StartCoroutine(RequestCoroutine());
}
private IEnumerator RequestCoroutine()
string url = "https://apps.game.qq.com/CommArticle/app/reg/gdate.php";
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
yield return request.SendWebRequest();
if(request.result == UnityWebRequest.Result.Success)
{
Debug.Log(request.downloadHandler.text);
}
else
Debug.LogError($"get time failed: {request.error}");
}
}
调用接口我们可以收到如图所示的响应,我们只需要通过Split函数将字符串分割,获取到等号后面的部分,再使用Substring函数截取‘’符号中间的部分即可:
string timeStr = request.downloadHandler.text.Split('=')[1];
timeStr = timeStr.Trim().Substring(1, timeStr.Length - 4);
Debug.Log(timeStr);
完整代码:
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Example : MonoBehaviour
{
//标记时间
private const string flag = "2022-03-17 17:11:25";
//有效期 单位:天
private const int expires = 30;
private void Start()
{
StartCoroutine(RequestCoroutine());
}
private IEnumerator RequestCoroutine()
string url = "https://apps.game.qq.com/CommArticle/app/reg/gdate.php";
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
yield return request.SendWebRequest();
if(request.result == UnityWebRequest.Result.Success)
{
Debug.Log(request.downloadHandler.text);
string timeStr = request.downloadHandler.text.Split('=')[1];
timeStr = timeStr.Trim().Substring(1, timeStr.Length - 4);
Debug.Log(timeStr);
DateTime flagTime = DateTime.Parse(flag);
DateTime nowTime = DateTime.Parse(timeStr);
TimeSpan span = nowTime - flagTime;
Debug.Log(span);
if (span.Days >= expires) Application.Quit();
}
else
Debug.LogError($"get time failed: {request.error}");
}
}
来源:https://blog.csdn.net/qq_42139931/article/details/123555866


猜你喜欢
- 在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事。今
- 今天写Tab的时候由于TAB的跳转问题去查资料,倒反而发现更有趣的问题,就是如何将TAB放置在屏幕的底端。 <?xml version
- 说到Java的本地存储,肯定使用IO流进行操作。首先,我们需要一个创建文件的函数createNewFile:public static bo
- 首先添加一个timer,50susing System;using System.Collections.Generic;using Sys
- 原因如下: Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的
- 1:RabbitMQ是个啥?(专业术语参考自网络)RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间
- 最近开发的时候,偶尔遇到在线上稳定运行的webview内嵌的h5页面加载不出来,一直定位不到具体原因(因为我们自己做的兼容性测试上不重现),
- 目标本文提供一种自定义注解,来实现业务审批操作的DEMO,不包含审批流程的配置功能。具体方案是自定义一个Aspect注解,拦截sevice方
- 1. 基本用法<dependency> <groupId>org.redisson</groupI
- 本文实例为大家分享了Java界面编程实现界面跳转的具体代码,供大家参考,具体内容如下在事件处理中创建对象public void action
- 在每一个窗体生成的时候,都会针对于当前的窗体定义InitializeComponent()方法,该方法实际上是由系统生成的对于窗体界面的定义
- 由于我使用的是properties类型的配置文件,在对druid的参数进行配置的时候,多加了druid,也就是spring.datasour
- 首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显
- 一 应用规划: ※ 确定功能。 ※ 必须的界面及界面跳转的流程。
- 基于比较的排序算法基本原理及Java实现1. 七大基于比较的排序-总览1.1常见基于比较的排序分类1.2时间复杂度,空间复杂度以及稳定性。稳
- Spring AOP proxyTargetClass的行为要点列表形式proxyTargetClasstrue目标对象实现了接口 – 使用
- 调用后动态壁纸其实是显示在Activity的后面,而Activity则是透明显示,这样就可以看到下面的动态壁纸,如果Activity不是透明
- 本文实例为大家分享了Android分类侧滑菜单的制作方法,供大家参考,具体内容如下classificmenuActivity.java代码:
- 根据UGUI的射线检测机制获取当前鼠标下的UI:/// <summary> /// 获取鼠标停留处UI
- 写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码:package allone.verbank.apad.clien