为了防止有些老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测试即可。
当然了,还可以扩展一下,增加小时,分钟等。当然也可以转换一下思路,不限制使用使用日期,限制项目的打开使用次数,或者两者一起用。
该文章介绍了一种方法,通过在Unity中创建一个脚本来判断设备是否联网,并获取网络时间来限制项目的使用日期。如果超过设定的日期或设备未联网,项目会自动退出。代码示例展示了如何实现这一功能,包括检查网络连接、获取网络时间等步骤。此外,还讨论了可以扩展限制方式,如限制使用次数等。
1570





