IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity 设置软件使用期限,加密软件 -> 正文阅读

[游戏开发]Unity 设置软件使用期限,加密软件

Unity 设置软件使用期限

说明:前段时间公司有一个需求就是要为我们用Unity 开发的产品加个简单的使用限制,目的是为了交到客户手上演示的时候,有一个体验时间限制。
首先,解决这个需求有三种思路,第一种是设置使用次数,第二种是设置使用软件的时长,第三种是设置使用期限。今天我把三种思路都给大家演示一下。好,我们开始。

第一种:限制软件使用次数

1,创建一个名为Test_Times 的脚本,然后定义变量

 //定义变量,体验次数
    public int times=10;
 //定义变量,目前使用了几次
    int i = 0;
    private void Awake()
    {
        //下次运行读取使用次数
        i = PlayerPrefs.GetInt("体验次数");
        Debug.Log(i);
        //判断当前使用次数是否超过定义的体验次数
        if (i >= times)
        {
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
            Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
        }
        i++;
        //将使用次数存储起来
        PlayerPrefs.SetInt("体验次数", i);
    }

2,为了测试,我们可以利用GUI把使用次数显示到屏幕上

 private void OnGUI()
    {
        GUIStyle gs = new GUIStyle();
        gs.fontSize = 20;
        gs.normal.textColor = Color.white;
        GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次", gs);
        if (GUI.Button(new Rect(60, 60, 100, 30), "重置次数"))
         {
            //清除掉存储到硬盘上的过往使用次数
             PlayerPrefs.DeleteKey("体验次数");
             i = 0;
             GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次");
         }
    }

3,效果如下
在这里插入图片描述设置使用次数的运行效果。

第二种:限制使用软件的时长

1,创建一个名为Test_GameTime 的脚本,然后定义变量

  //目前游戏时长
    float time;
   //体验游戏时长
    public float gameTime=300.0f;
    private void Update()
    {
        time = Time.realtimeSinceStartup;
        if (time <= gameTime)
        {
            return;
        }
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
        Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
    }

2,为了测试,我们可以利用GUI把使用次数显示到屏幕上

 private void OnGUI()
    {
          GUIStyle gs = new GUIStyle();
          gs.fontSize = 20;
          gs.normal.textColor = Color.white;
          GUI.Label(new Rect(30, 30, 200, 60), "体验版:体验时长" + (gameTime - time).ToString("f2"), gs);
    }

3,效果如下
在这里插入图片描述设置使用时长的效果

第三种:限制使用软件的期限

1,创建一个名为Test_SystemTime的脚本,然后定义变量

 //当前年、月、日、时、分、秒
    float curYear, curMonth, curDay, curHours, curMin, curSec;
    //截至XX年
    public float year;
    //截至XX月
    public float month;
    //截至XX日
    public float day;
    //截至XX时
    public float hours;
    //截至XX分
    public float min;
    //截至XX秒
    public float sec;
    
     private void Update()
    {
        curYear = System.DateTime.Now.Year;
            curMonth = System.DateTime.Now.Month;
            curDay = System.DateTime.Now.Day;
            curHours = System.DateTime.Now.Hour;
            curMin = System.DateTime.Now.Minute;
            curSec = System.DateTime.Now.Second;
            if (curYear > year)
            {
#if UNITY_EDITOR
                UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
            }
            else if (curYear < year)
            {
                return;
            }
            else if (curYear == year)
            {
                if (curMonth > month)
                {
#if UNITY_EDITOR
                    UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                    Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                }
                else if (curMonth < month)
                {
                    return;
                }
                else if (curMonth == month)
                {
                    if (curDay > day)
                    {
#if UNITY_EDITOR
                        UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                        Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                    }
                    else if (curDay < day)
                    {
                        return;
                    }
                    else if (curDay == day)
                    {
                        if (curHours > hours)
                        {
#if UNITY_EDITOR
                            UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                            Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                        }
                        else if (curHours < hours)
                        {
                            return;
                        }
                        else if (curHours == hours)
                        {
                            if (curMin > min)
                            {
#if UNITY_EDITOR
                                UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                                Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                            }
                            else if (curMin < min)
                            {
                                return;
                            }
                            else if (curMin == min)
                            {
                                if (curSec > sec)
                                {
#if UNITY_EDITOR
                                    UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                                    Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                                }
                                else if (curSec <= sec)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
            }
    }

2,为了测试,我们可以利用GUI把使用次数显示到屏幕上

 private void OnGUI()
    {
         GUIStyle gs = new GUIStyle();
         gs.fontSize = 20;
         gs.normal.textColor = Color.white;
         GUI.Label(new Rect(30, 30, 200, 60), "体验版:截止日期为" + year + "年" + month + "月" + day + "日" + min + "分" + sec + "秒", gs);
    }

3,效果如下
在这里插入图片描述设置使用期限的效果

好了,至此三种思路已介绍完毕!最后,再次奉上把三种方式融合到一块的方法,废话不多说,源代码奉上
1,TestEditor.cs脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    public override void OnInspectorGUI()
    {
        //获取引用
        Test myKey = (Test)target;
        myKey.isNormal = EditorGUILayout.Toggle("正式版", myKey.isNormal);
        if(myKey.isNormal)
        {
            return;
        }
        myKey.experienceType = (ExperienceType)EditorGUILayout.EnumPopup("加密方式", myKey.experienceType);
            if (myKey.experienceType == ExperienceType.ByTimes)
            {
                myKey.times = EditorGUILayout.IntField("体验次数", myKey.times);
            }

            if (myKey.experienceType == ExperienceType.BySystemTime)
            {
                myKey.year = EditorGUILayout.FloatField("截止到哪年", myKey.year);
                myKey.month = EditorGUILayout.FloatField("截止到哪月", myKey.month);
                myKey.day = EditorGUILayout.FloatField("截止到哪日", myKey.day);
                myKey.hours = EditorGUILayout.FloatField("截止到几时", myKey.hours);
                myKey.min = EditorGUILayout.FloatField("截止到几分", myKey.min);
                myKey.sec = EditorGUILayout.FloatField("截止到几秒", myKey.sec);
            }
            if (myKey.experienceType == ExperienceType.ByGameTime)
            {
                myKey.gameTime = EditorGUILayout.FloatField("体验时长", myKey.gameTime);
            }
        }
}

2,Test.cs脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum ExperienceType
{
    ByTimes,//通过次数
    BySystemTime,//通过系统时长
    ByGameTime//通过游戏时长
}
public class Test : MonoBehaviour
{
    public bool isNormal;
    //目前第几次
    int i = 0;
    bool isByTimes;
    //目前游戏时长
    float time;
    bool isByGameTime;
    //当前年、月、日、时、分、秒
    float curYear, curMonth, curDay, curHours, curMin, curSec;
    bool isBySystemTime;

    public ExperienceType experienceType;
    //体验次数
    public int times;

    //体验时长
    //年
    public float year;
    //月
    public float month;
    //日
    public float day;
    //时
    public float hours;
    //分
    public float min;
    //秒
    public float sec;

    //体验游戏时长
    public float gameTime;
    private void Awake()
    {
        if (isNormal)
            return;
        switch (experienceType)
        {
            case ExperienceType.ByTimes:
                isByTimes = true;
                i = PlayerPrefs.GetInt("体验次数");
                Debug.Log(i);
                if (i >= times)
                {
#if UNITY_EDITOR
                    UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                    Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                }
                i++;
                //将使用次数存储起来
                PlayerPrefs.SetInt("体验次数", i);
                break;

            case ExperienceType.ByGameTime:
                isByGameTime = true;
                break;

            case ExperienceType.BySystemTime:
                isBySystemTime = true;
                break;
        }
    }

    private void FixedUpdate()
    {
        if (isByGameTime)
        {
            time = Time.realtimeSinceStartup;
            if (time <= gameTime)
            {
                return;
            }
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
            Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
        }
        if (isBySystemTime)
        {
            curYear = System.DateTime.Now.Year;
            curMonth = System.DateTime.Now.Month;
            curDay = System.DateTime.Now.Day;
            curHours = System.DateTime.Now.Hour;
            curMin = System.DateTime.Now.Minute;
            curSec = System.DateTime.Now.Second;


            if (curYear > year)
            {
#if UNITY_EDITOR
                UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
            }
            else if (curYear < year)
            {
                return;
            }
            else if (curYear == year)
            {
                if (curMonth > month)
                {
#if UNITY_EDITOR
                    UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                    Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                }
                else if (curMonth < month)
                {
                    return;
                }
                else if (curMonth == month)
                {
                    if (curDay > day)
                    {
#if UNITY_EDITOR
                        UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                        Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                    }
                    else if (curDay < day)
                    {
                        return;
                    }
                    else if (curDay == day)
                    {
                        if (curHours > hours)
                        {
#if UNITY_EDITOR
                            UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                            Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                        }
                        else if (curHours < hours)
                        {
                            return;
                        }
                        else if (curHours == hours)
                        {
                            if (curMin > min)
                            {
#if UNITY_EDITOR
                                UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                                Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                            }
                            else if (curMin < min)
                            {
                                return;
                            }
                            else if (curMin == min)
                            {
                                if (curSec > sec)
                                {
#if UNITY_EDITOR
                                    UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
                                    Application.Quit();
#endif
#if UNITY_ANDROID
                    Application.Quit();
#endif
                                }
                                else if (curSec <= sec)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private void OnGUI()
    {
        if (isByGameTime)
        {
            GUIStyle gs = new GUIStyle();
            gs.fontSize = 20;
            gs.normal.textColor = Color.white;
            GUI.Label(new Rect(30, 30, 200, 60), "体验版:体验时长" + (gameTime - time).ToString("f2"), gs);
        }

        if (isByTimes)
        {
            GUIStyle gs = new GUIStyle();
            gs.fontSize = 20;
            gs.normal.textColor = Color.white;
            GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次", gs);
            if (GUI.Button(new Rect(60, 60, 100, 30), "重置次数"))
            {
                Reset();
                GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次");
            }
        }
        if (isBySystemTime)
        {
            GUIStyle gs = new GUIStyle();
            gs.fontSize = 20;
            gs.normal.textColor = Color.white;
            GUI.Label(new Rect(30, 30, 200, 60), "体验版:截止日期为" + year + "年" + month + "月" + day + "日" + min + "分" + sec + "秒", gs);
        }
    }

    /// <summary>
    /// 重置
    /// </summary>
    public void Reset()
    {
        PlayerPrefs.DeleteKey("体验次数");
        i = 0;
    }
}

3,将TestEditor.cs脚本放到Editor文件夹下(没有此文件夹,那便创建一个),然后新建一个空物体挂上Test.cs脚本即可。效果如下:
在这里插入图片描述在非正式版的情况下,我们可以在这三种方式中,任意选择限制方式,然后设置好值即可。

最后补充,第一次写博客,有写的不好的地方希望大家不要见怪,嘻嘻。。。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 17:00:38  更:2021-08-12 17:01:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 5:37:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码