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 initialization
    void 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()
    {
        //异常捕捉,如果发生异常,比如闪退,限制改为false
        try
        {
            //限制使用时间,如果不在这个区间内,直接退出程序
            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\Software
        RootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
        //打开子项:HKEY_CURRENT_USER\Software\MyRegDataApp
        if ((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 + "次");
            //使用次数减1
            int 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 initialization
    void 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\Software
        RootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
        //打开子项:HKEY_CURRENT_USER\Software\MyRegDataApp
        if ((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 + "次");
            //使用次数减1
            int 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 update
    void 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 frame
    void Update()
    {
        
    }
}

4-2、效果

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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python学习21

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)

目录 小球视频 图像输出函数 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 initgraph 函数 图片输出 代码详解&#xff1a; 1. 初始化图形界面 2. 设置背景颜色并清除屏幕 3. 加载并显示图片 4. 等待用户输入并退出程序 图形界面中的小球 1…

docer compose部署simple-docker

简介 一个看似简陋但是功能足够用的docker管理工具 安装 创建目录 mkdir -p /opt/simple-docker cd /opt/simple-docker 创建并启动容器 编写docker-compose.yml文件,内容如下 version: 3 services: redis: image: redis:latest restart: always web: image: registry.cn-…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

解决hive表新增的字段查询为空null问题

Hive分区表新增字段&#xff0c;查询时数据为NULL的解决方案 由于业务拓展&#xff0c;需要往hive分区表新增新的字段&#xff0c;hive版本为2点多。 于是利用 alter table table_name add columns (col_name string )新增字段&#xff0c;然后向已存在分区中插入数据&#x…

MySQL学习记录——사 表结构的操作

文章目录 1、创建表2、查看表结构3、改变表结构4、删除表5、总结 1、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 例子 create table users ( id int, name varchar(20) c…

Linux Shell系列--realpath 返回给定路径的规范化绝对路径名

一、目的 在linux系统中有绝对路径、相对路径&#xff0c;还有符号链接&#xff0c;我们在shell脚本中获取一个文件或者路径的绝对路径名称&#xff0c;这个时候就需要realpath命令。 本篇主要介绍realpath命令的相关内容。 二、介绍 realpath命令主要功能是解析给定的路径&am…

游戏服务器租用多少钱一年?看完再买不吃亏!

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

GC垃圾回收

文章目录 GC垃圾回收一、垃圾回收概述1、什么是垃圾&#xff1f;2、什么是垃圾回收&#xff1f;3、为什么需要垃圾回收&#xff1f;4、Java垃圾回收机制5、Java垃圾回收区域 二、对象存活判断1、引用计数算法&#xff08;Python&#xff09;1&#xff09;基本思路2&#xff09;…

C语言——联合体类型

&#x1f4dd;前言&#xff1a; 在前面两篇文章&#xff1a;C语言——结构体类型&#xff08;一&#xff09;和C语言——结构体&#xff08;二&#xff09;中&#xff0c;我们讲述了C语言中重要的数据类型之一&#xff1a;结构体类型&#xff0c;今天我们来介绍一下C语言中的另…

初识C语言·编译与链接

1 翻译环境和运行环境 C语言标准ANSI C 实现C语言代码的时候 一般需要经过两种环境&#xff0c;一是翻译环境&#xff0c;二是运行环境&#xff0c;计算机能识别的是二进制的指令&#xff0c;人写完代码后通过翻译环境&#xff0c;使代码变成计算机能读懂的可执行的机器指令&a…

Mac上软件闪退(意外退出)的解决方法

mac苹果电脑上运行软件会意外退出&#xff0c;怎么办&#xff0c;可以试试下面的方法&#xff0c;亲测可行&#xff01; 第一种方法&#xff1a; 1、打开访达&#xff0c;进入应用程序目录&#xff0c;找到闪退的软件图标&#xff0c;在软件图标上右键选择“显示简介”&#…

华为OD机试真题C卷-篇3

文章目录 查找一个有向网络的头节点和尾节点幼儿园篮球游戏 查找一个有向网络的头节点和尾节点 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多…

配备Apple T2 安全芯片的 Mac 机型及T2芯片mac电脑U盘装系统教程

T2 芯片为 Mac 提供了一系列功能&#xff0c;例如加密储存和安全启动功能、增强的图像信号处理功能&#xff0c;以及适用于触控 ID 数据的安全保护功能。哪些电脑配备了 T2 安全芯片呢&#xff0c;T2芯片mac电脑又如何重装系统呢&#xff1f;跟随小编一起来看看吧&#xff01; …

Dell服务器iDRAC9忘记密码, 通过RACADM工具不重启 重置密码

系列文章目录 文章目录 系列文章目录前言一、RACADM工具二、linux环境1.解压安装RACADM工具测试RACADM工具重置iDRAC密码 Windows环境 前言 一、RACADM工具 RACADM工具 官网参考信息 https://www.dell.com/support/kbdoc/zh-cn/000126703/%E5%A6%82%E4%BD%95-%E9%87%8D%E7%BD…

跟着cherno手搓游戏引擎【21】shaderLibrary(shader管理类)

前置&#xff1a; ytpch.h&#xff1a; #pragma once #include<iostream> #include<memory> #include<utility> #include<algorithm> #include<functional> #include<string> #include<vector> #include<unordered_map> #in…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

Mac电脑上好用的设计绘图软件都有哪些,这6款一定不要错过!

Mac上好用的设计绘图软件有Sketch、Adobe XD、Principle、Illustrator和Affinity Designer、AutoCAD等。这些软件都具有操作简便、功能强大、上手容易等特点&#xff0c;能够满足设计师的各种需求。 Affinity Designer Affinity Designer是一款专业的矢量图形设计软件&#x…

LeetCode-第2469题=温度转换

1.题目描述 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数组 ans …

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布&#xff0c;注册该账号后&#xff0c;可以申请软件、下载离线文档&#xff0c;查看技术案例等功能 2. 账号注册 步骤 1&#xff1a;点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…