Unity 设置软件使用期限,加密软件

1 篇文章 0 订阅
1 篇文章 0 订阅

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脚本即可。效果如下:
在这里插入图片描述在非正式版的情况下,我们可以在这三种方式中,任意选择限制方式,然后设置好值即可。

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

  • 17
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Unity软件加密方式主要是对Assembly-CSharp.dll进行加密,这样可以保护Unity的主要代码逻辑不被反编译,以保护软件开发商的合法权益。同时,可以使用工具如DS Protector对Unity软件中的资源文件(如.ress和resources)进行加密,以防止这些资源被非法提取。 一种常用的对称加密体制是DES(Data Encryption Standard),它具有高安全性、低计算开销和快速处理速度的特点。特别适合用于对大量数据和大文件进行加密保护。DES加密算法的基本原理是将输入的明文数据按照一定规则进行加密转换,生成密文数据。 Unity软件加密的目的是为了保护软件的安全性,防止非法的访问和使用。虽然DES加密算法本身具有较高的安全性,但并不能保证绝对的安全性。然而,由于DES加密算法的强大健壮性和耗时的穷举法破解难度,攻击者很难通过对加密算法的破解来获取网络游戏数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [以unity3d为例解读:游戏数据加密](https://blog.csdn.net/flyTie/article/details/126068128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值