Unity3D实现项目限制功能(使用次数限制和时间限制)

系列文章目录

unity工具


文章目录

  • 系列文章目录
  • 前言
  • 一、时间限制
    • 1-1、代码如下:
  • 二、次数限制
    • 2-1、 在Unity项目中需要对注册表进行操作,还需要设置一下API兼容级别设置成 .NET Framework
    • 2-2、设置如下图 Player里面
    • 2-3、代码如下:
  • 三、同时控制时间和次数
  • 四、unity自带保存读取次数限制
    • 4-1、代码如下:
    • 4-2、效果
  • 总结


前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
在软件开发的时候,可能会遇到程序的使用次数限制,以及时间的限制,下面就写一下这两种
方法是新建注册表,增加键值对,修改键值,完成对程序的控制


提示:以下是本篇文章正文内容,下面案例可供参考

一、时间限制

修改脚本里面的startTime和endTime即可

1-1、代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Time_Restrict : MonoBehaviour
{//用户是否超过使用日期bool Islate = false;// Use this for initializationvoid Start(){//===(比如2月1日开始计算,到2月8日结束)//小于minTime 时间或者大于maxTime时间 ,将不可使用DateTime startTime = Convert.ToDateTime("2024-2-1 16:29:00");DateTime endTime = Convert.ToDateTime("2024-2-8 16:29:00");if (startTime > DateTime.Now || DateTime.Now > endTime){//不在使用时间内,会直接退出程序Islate = true;}SetPlayTime();}/// <summary>/// 设置用户使用次数/// </summary>void SetPlayTime(){//异常捕捉,如果发生异常,比如闪退,限制改为falsetry{//限制使用时间,如果不在这个区间内,直接退出程序if (Islate){Debug.Log("超时间了");Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息}}catch{Islate = false;}}//退出程序private void OnExit(){Application.Quit();}
}

但是有个小弊端,用户改了系统时间,软件就可以使用了,但也是只能在设置时间区间内使用。

二、次数限制

2-1、 在Unity项目中需要对注册表进行操作,还需要设置一下API兼容级别设置成 .NET Framework

2-2、设置如下图 Player里面

在这里插入图片描述

具体想写到哪个注册表,可以自行设置名称

2-3、代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Win32;
public class Frequency_Restrict : MonoBehaviour
{//最大使用次数int MaxUsageCount = 3;/// <summary>/// 如果想刷新次数,直接换一个键值名称就行了 老:UseTime1  新:UseTime2/// </summary>void Start(){SetPlayFrequency();}/// <summary>/// 设置用户使用次数/// </summary>void SetPlayFrequency(){//创建键值对RegistryKey RootKey, RegKey;//项名为:HKEY_CURRENT_USER\SoftwareRootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);//打开子项:HKEY_CURRENT_USER\Software\MyRegDataAppif ((RegKey = RootKey.OpenSubKey("TestToControlUseTime", true)) == null){RootKey.CreateSubKey("TestToControlUseTime");               //不存在,则创建子项RegKey = RootKey.OpenSubKey("TestToControlUseTime", true);  //打开键值RegKey.SetValue("UseTime1", (object)MaxUsageCount);         //创建键值,存储最大可使用次数return;}//异常捕捉,如果出现程序异常,比如闪退,次数更新为开始设置的最大使用次数try{object usetime = RegKey.GetValue("UseTime1");        //读取键值,可使用次数print("还可以使用:" + usetime + "次");//使用次数减1int newtime = int.Parse(usetime.ToString()) - 1;if (newtime < 0){//到期退出程序RegKey.SetValue("UseTime1", (object)newtime);Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息}else{RegKey.SetValue("UseTime1", (object)newtime);    //更新键值,可使用次数减1}}catch{RegKey.SetValue("UseTime1", (object)MaxUsageCount);print("更新使用次数");}}/// <summary>/// 退出程序/// </summary>private void OnExit(){Application.Quit();}
}

注册表这种比较保险一点,但是也是可以破解的,注册表好像重装系统就没有了

三、同时控制时间和次数

1.两种放一起实现效果更好用

代码如下:

using Microsoft.Win32;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Merge_Controller : MonoBehaviour
{//用户是否超过使用日期bool Islate = false;//最大使用次数int MaxUsageCount = 3;// Use this for initializationvoid Start(){//===(比如2月1日开始计算,到2月8日结束)//小于minTime 时间或者大于maxTime时间 ,将不可使用DateTime startTime = Convert.ToDateTime("2024-2-1 16:29:00");DateTime endTime = Convert.ToDateTime("2024-2-8 16:29:00");if (startTime > DateTime.Now || DateTime.Now > endTime){//不在使用时间内,会直接退出程序Islate = true;}SetPlaymerge();}void SetPlaymerge(){//创建键值对RegistryKey RootKey, RegKey;//项名为:HKEY_CURRENT_USER\SoftwareRootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);//打开子项:HKEY_CURRENT_USER\Software\MyRegDataAppif ((RegKey = RootKey.OpenSubKey("TestToControlUseTime", true)) == null){RootKey.CreateSubKey("TestToControlUseTime");               //不存在,则创建子项RegKey = RootKey.OpenSubKey("TestToControlUseTime", true);  //打开键值RegKey.SetValue("UseTime1", (object)MaxUsageCount);         //创建键值,存储最大可使用次数return;}//异常捕捉,如果出现程序异常,比如闪退,次数更新为开始设置的最大使用次数try{object usetime = RegKey.GetValue("UseTime1");        //读取键值,可使用次数print("还可以使用:" + usetime + "次");//使用次数减1int newtime = int.Parse(usetime.ToString()) - 1;if (newtime < 0|| Islate){//到期退出程序RegKey.SetValue("UseTime1", (object)newtime);Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息}else{RegKey.SetValue("UseTime1", (object)newtime);    //更新键值,可使用次数减1}}catch{RegKey.SetValue("UseTime1", (object)MaxUsageCount);print("更新使用次数");}}/// <summary>/// 退出程序/// </summary>private void OnExit(){Application.Quit();}
}

四、unity自带保存读取次数限制

1、用的是unity自带的保存和读取

4-1、代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnitySetMassage : MonoBehaviour
{private int intflage = 3;private  int intisbool = 0;// Start is called before the first frame updatevoid Start(){//PlayerPrefs.DeleteAll();判断有没有这个键值if (PlayerPrefs.HasKey("csxz")){intisbool = PlayerPrefs.GetInt("csxz");Debug.Log("还有几次:" + intisbool);if (intisbool <=0){Debug.Log("结束");Application.Quit();}}else{PlayerPrefs.SetInt("csxz", intflage);intisbool = intflage;}}//退出程序时保存private void OnApplicationQuit(){if (PlayerPrefs.HasKey("csxz")){intisbool--;PlayerPrefs.SetInt("csxz", intisbool);Debug.Log("还剩几次:" + intisbool);}}// Update is called once per framevoid Update(){}
}

4-2、效果

打印效果就不录视频了,感兴趣的话请自行测试一下吧,我把测试的打印出来
在这里插入图片描述

总结

以上就是讲了两种限制方法
不定时更新Unity开发技巧,觉得有用记得一键三连哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454476.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端超好玩的小游戏合集来啦--周末两天用html5做一个3D飞行兔子萝卜小游戏

文章目录 💖飞行兔子萝卜小游戏💟效果展示💟代码展示源码获取💖飞行兔子萝卜小游戏 💟效果展示 💟代码展示 <body> <script src=

Redis核心技术与实战【学习笔记】 - 14.Redis 旁路缓存的工作原理及如何选择应用系统的缓存类型

概述 我们知道&#xff0c;Redis 提供了高性能的数据存取功能&#xff0c;广泛应用在缓存场景中&#xff0c;既可以提升业务的响应速度&#xff0c;又可以避免把高并发的请求发送到数据库。 如果 Redis 做缓存时出现了问题&#xff0c;比如说缓存失效&#xff0c;那么&#x…

光隔离探头

一、前言。 光隔离探头的CMRR比高压差分探头要高很多,在一些共模电压较高的测量领域用的比较多,如:开关电源、逆变器等。但是市面上介绍光隔离探头的方案比较少,这里简要说明一下我的个人想法。 二、数字光和模拟光。 数字光就是通信上常用的光模块,传的是数字信号,带…

RabbitMQ-2.SpringAMQP

SpringAMQP 2.SpringAMQP2.1.创建Demo工程2.2.快速入门2.1.1.消息发送2.1.2.消息接收2.1.3.测试 2.3.WorkQueues模型2.2.1.消息发送2.2.2.消息接收2.2.3.测试2.2.4.能者多劳2.2.5.总结 2.4.交换机类型2.5.Fanout交换机2.5.1.声明队列和交换机2.5.2.消息发送2.5.3.消息接收2.5.4…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

[学习笔记]刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

【兼容认证】白鲸开源与银河麒麟高级服务器操作系统成功通过测试

2024年1月2日&#xff0c;北京白鲸开源科技有限公司&#xff08;以下简称"白鲸开源"&#xff09;荣幸宣布&#xff0c;白鲸开源旗下产品 WhaleStudio V2.4 已成功通过与麒麟软件有限公司旗下的银河麒麟高级服务器操作系统产品的兼容性测试。 麒麟软件有限公司的银河麒…

蓝桥杯Web应用开发-浮动与定位

浮动与定位 浮动布局比较灵活&#xff0c;不易控制&#xff0c;而定位可以控制元素的过分灵活性&#xff0c;给元素一个具体的空间和精确的位置。 浮动 我们使用 float 属性指定元素沿其容器的左侧或右侧放置&#xff0c;浮动布局常见取值如下&#xff1a; • left&#xff0…

普通编程,机器学习与深度学习

普通编程&#xff1a;基于人手动设置规则&#xff0c;由输入产生输出经典机器学习&#xff1a;人手工指定需要的特征&#xff0c;通过一些数学原理对特征与输出的匹配模式进行学习&#xff0c;也就是更新相应的参数&#xff0c;从而使数学表达式能够更好的根据给定的特征得到准…

学习Android的第四天

目录 Android FrameLayout ( 帧布局 ) FrameLayout size 大小 FrameLayout 属性 Android GridLayout ( 网格布局 ) GridLayout 属性 计算器布局 Android AbsoluteLayout 绝对布局 AbsoluteLayout 四大控制属性 Android FrameLayout ( 帧布局 ) FrameLayout 是 Android…

springboot154基于Spring Boot智能无人仓库管理

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

JWT令牌

生成解析 jwt的工具类 fileter快速入门 登录过程 拦截器