【Unity限制项目软件使用日期】

该文章介绍了一种方法,通过在Unity中创建一个脚本来判断设备是否联网,并获取网络时间来限制项目的使用日期。如果超过设定的日期或设备未联网,项目会自动退出。代码示例展示了如何实现这一功能,包括检查网络连接、获取网络时间等步骤。此外,还讨论了可以扩展限制方式,如限制使用次数等。

为了防止有些老6甲方,我们可以给项目打个时间戳,对项目进行限制使用日期。

整体思路就是先判断设备是否联网,然后获取网络时间,最后用网络时间来比较限制的日期,如果已经超过了限制日期或者设备没有联网,那就让项目自动退出。

为什么一定要联网,不联网的话就只能获取本地系统时间了。有点开发常识的都能破解,那就没有任何意义了。

当然了,大家可以自行选择是否限制联网;好了上代码:

①创建Close脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Networking;

public class Close : MonoBehaviour
{
    [Header("请输入限制年份")]
    public int year;
    [Header("请输入限制月份")]
    public int moon;
    [Header("请输入限制日期")]
    public int day;
    [Header("无网络的情况下是否允许运行")]
    public bool b = true;

    [DllImport("wininet")]
    private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);

    private void Start()
    {
        Limitation();
    }

    /// <summary>
    /// 是否进行限制
    /// </summary>
    private void Limitation()
    {
        //如果没有填写默认为0,允许程序运行
        if (year == 0 || moon == 0 || day == 0)
        {
        }
        else
        {
            CheckInternet();
        }
    }
    /// <summary>
    /// 检查是否有网络连接
    /// </summary>
    private void CheckInternet()
    {
        if (IsConnectedInternet()==false)
        {
            Debug.Log("没有网络连接");

            //无网络是否允许程序进行
            if (!b)
            {
                QuitProcedure();
            }

            //无网络就获取本地时间
            if (DateTime.Now.Year >= year && DateTime.Now.Month >= moon && DateTime.Now.Day >= day)
            {
                QuitProcedure();
            }
        }
        else
        {
            Debug.Log("网络连接正常");
            StartCoroutine(GetWebTime());
        }
    }

    public static void QuitProcedure()
    {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
    Application.Quit();
#endif
    }



    #region 获取网络时间

    /// <summary>
    /// 获取当前网络时间
    /// </summary>
    /// <returns></returns>
    IEnumerator GetWebTime()
    {
        string url = "https://www.baidu.com";

        DateTime _webNowTime = DateTime.Now;
        UnityWebRequest WebRequest = new UnityWebRequest(url);

        yield return WebRequest.SendWebRequest();

        if (WebRequest.isDone && string.IsNullOrEmpty(WebRequest.error))
        {
            Dictionary<string, string> resHeaders = WebRequest.GetResponseHeaders();
            string key = "DATE";
            string value = null;
            if (resHeaders != null && resHeaders.ContainsKey(key))
            {
                resHeaders.TryGetValue(key, out value);
            }

            if (value == null)
            {
                Debug.LogError("没有获取到key为DATE对应的Value值...");
                yield break;
            }

            _webNowTime = FormattingGMT(value);

            TimeSpan cha = (_webNowTime - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)));
            long t = (long)cha.TotalSeconds;

            string y = _webNowTime.ToString().Split('/')[0];
            string m = _webNowTime.ToString().Split('/')[1];
            string d = _webNowTime.ToString().Split('/')[2].Split(' ')[0];
            if (int.Parse(y) >= year && int.Parse(m) >= moon && int.Parse(d) >= day)
            {
                QuitProcedure();
            }
        }
    }

    /// <summary>
    /// GMT(格林威治时间)时间转成本地时间
    /// </summary>
    /// <param name="gmt">字符串形式的GMT时间</param>
    /// <returns></returns>
    private DateTime FormattingGMT(string gmt)
    {
        DateTime dt = DateTime.MinValue;
        try
        {
            string pattern = "";
            if (gmt.IndexOf("+0") != -1)
            {
                gmt = gmt.Replace("GMT", "");
                pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
            }

            if (gmt.ToUpper().IndexOf("GMT") != -1)
            {
                pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
            }

            if (pattern != "")
            {
                dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture,
                    System.Globalization.DateTimeStyles.AdjustToUniversal);
                dt = dt.ToLocalTime();
            }
            else
            {
                dt = Convert.ToDateTime(gmt);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e);
            Debug.LogError("时间转换错误...");
        }
        return dt;
    }
    #endregion

    /// <summary>
    /// C#判断是否联网
    /// </summary>
    /// <returns></returns>
    public bool IsConnectedInternet()
    {
        int i = 0;
        if (InternetGetConnectedState(out i, 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

②将脚本挂载到项目一开始就要激活的物体上,我这里自己创建了一个gameobject作为示例挂载

然后设置一下要限制的日期,建议还是取消勾选无网络允许运行

 最后在编辑器环境下或者打包exe测试即可。

当然了,还可以扩展一下,增加小时,分钟等。当然也可以转换一下思路,不限制使用使用日期,限制项目的打开使用次数,或者两者一起用。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔法师干脆面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值