更新日期:2020年3月2日。
Github源码:[点我获取源码] Gitee源码:[点我获取源码]
索引
- 授权验证简介
- 使用授权验证
- 取消永久授权
- 建立授权者
- 通过本地时间授权
- 通过远程时间授权
- 通过本地授权码授权
- 通过远程授权码授权
- 使用授权者
授权验证简介
授权验证功能支持在你的游戏启动时,执行指定的授权检查,可以是本地授权检查,也可以是远程授权检查,只有授权检查通过才能正常进入游戏,如果授权检查失败,框架将会瘫痪整个程序,无论用户做出任何补救措施都将是徒劳(介于没有登录服务器的情况下)。
使用授权验证
取消永久授权
要使用授权验证功能,必须取消框架默认的永久授权条件。
在Main模块的属性面板,打开License选项卡,取消勾选Permanent License(勾选此选项为永久授权)。
建立授权者
我们新建一个授权者MyLicenser(授权者类必须继承至LicenserBase):
public class MyLicenser : LicenserBase
{
public override string LicenseFailurePrompt
{
get
{
return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
}
}
public override IEnumerator Checking()
{
throw new System.NotImplementedException();
}
}
通过本地时间授权
如果想做的简单一点,直接通过本地时间授权,比如让用户每次下载游戏只能玩两个月,两个月之后必须进入官网重新下载(当然是针对单机游戏),我们如下修改:
public class MyLicenser : LicenserBase
{
//用户下载游戏(也即是第一次进入游戏)的时间
private DateTime _loadTime;
public override string LicenseFailurePrompt
{
get
{
return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
}
}
/// <summary>
/// 授权验证
/// </summary>
public override IEnumerator Checking()
{
//获取下载时间
_loadTime = Main.m_CustomModule["Loader"].GetLoadTime();
yield return null;
int days = new TimeSpan(DateTime.Now.Ticks - _loadTime.Ticks).Days;
//使用天数小于等于60天,才授权通过
IsLicensePass = days <= 60;
}
}
通过远程时间授权
本地时间授权有一个致命的BUG,用户可以随意修改自己的系统时间,导致授权失误!所以在拥有服务器的情况下,我们可以进一步建立远程时间授权机制,我们如下修改:
public class MyLicenser : LicenserBase
{
public override string LicenseFailurePrompt
{
get
{
return "授权验证失败,请退出游戏,进入官网重新下载游戏!";
}
}
/// <summary>
/// 授权验证
/// </summary>
public override IEnumerator Checking()
{
//获取下载时间
DateTime loadTime = Main.m_CustomModule["Loader"].GetLoadTime();
//向服务器发起授权验证请求(传入下载时间,不传当前时间,当前时间由服务器获取)
yield return Main.m_CustomModule["Licenser"].BeginLicense(loadTime);
//等待获取验证状态
IsLicensePass = Main.m_CustomModule["Licenser"].IsLicensePass;
}
}
通过本地授权码授权
我们也可以通过让用户输入授权码的形式来授权,我们如下修改:
public class MyLicenser : LicenserBase
{
public override string LicenseFailurePrompt
{
get
{
return "授权验证失败,授权码错误,请重新进入游戏!";
}
}
/// <summary>
/// 授权验证
/// </summary>
public override IEnumerator Checking()
{
//打开授权码输入界面
yield return Main.m_UI.OpenTemporaryUI<LicenserPanel>();
LicenserPanel licenserPanel = Main.m_UI.GetOpenedUI<LicenserPanel>();
//等待用户输入授权码完成
yield return licenserPanel.WaitInputDone();
//授权码仓库中存在当前输入的授权码,则授权通过
if (Main.m_CustomModule["LicenseCodeHouse"].IsExist(licenserPanel.LicenseCode))
{
IsLicensePass = true;
}
else
{
IsLicensePass = false;
}
}
}
通过远程授权码授权
同样的问题,本地授权码形式也可以进阶为远程授权,这样可以让我们的游戏安全系数更高,即使用户输入的授权码正确,你也可以通过同一个IP只能绑定同一个授权码的喷血设定防止用户到处传播一个授权码,我们如下修改:
public class MyLicenser : LicenserBase
{
public override string LicenseFailurePrompt
{
get
{
return "授权验证失败,授权码错误,请重新进入游戏!";
}
}
/// <summary>
/// 授权验证
/// </summary>
public override IEnumerator Checking()
{
//打开授权码输入界面
yield return Main.m_UI.OpenTemporaryUI<LicenserPanel>();
LicenserPanel licenserPanel = Main.m_UI.GetOpenedUI<LicenserPanel>();
//等待用户输入授权码完成
yield return licenserPanel.WaitInputDone();
//向服务器发起授权验证请求
yield return Main.m_CustomModule["Licenser"].BeginLicense(licenserPanel.LicenseCode);
//等待获取验证状态
IsLicensePass = Main.m_CustomModule["Licenser"].IsLicensePass;
}
}
使用授权者
如上所述的只是几种授权方式的例子,你可以自定义任何授权方式,不过必须得在Main模块属性面板的License选项卡下启用该授权者,指定的授权者才能正式启用。