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

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开发技巧,觉得有用记得一键三连哦。


http://www.kler.cn/news/233320.html

相关文章:

  • 【C++】引用与内联
  • 【Flink】SQL-CLIENT中出现 Could not find any factory for identifier ‘kafka‘
  • 5 scala的函数式编程简介
  • 【QT】Graphics View绘图架构
  • 【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)
  • Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)
  • 【linux开发工具】vim详解
  • SpringBoot WebSocket客户端与服务端一对一收发信息
  • html5 audio video
  • [高性能] - 缓存架构
  • 《走进科学》灵异事件:Nginx配置改了之后一直报错
  • 使用 WMI 查询安全软件信息
  • C/C++ 关于 SHA256 的使用
  • B站弹幕分析系统
  • Python爬虫实战:抓取猫眼电影排行榜top100#4
  • React18原理: 生命周期中特别注意事项
  • 大数据之Hadoop3简单入门(一)(通俗易懂)
  • 5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】
  • C语言笔试题之两数相加(多次反转链表实现)
  • Git中为常用指令配置别名
  • Go 中如何检查文件是否存在?可能产生竞态条件?
  • re:从0开始的CSS学习之路 4. 长度单位
  • 2月05日,每日信息差
  • SolidWorks学习笔记——入门知识2
  • 用C语言列出Linux或Unix上的网络适配器
  • 【C语言】深入理解指针
  • 从一到无穷大 #23 《流计算系统图解》书评
  • Netty应用(一) 之 NIO概念 基本编程
  • 人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统
  • C++——位图与布隆过滤器