Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在unity中,top exe如何在特定日期时间后过期_C#_Unity3d - Fatal编程技术网

C# 在unity中,top exe如何在特定日期时间后过期

C# 在unity中,top exe如何在特定日期时间后过期,c#,unity3d,C#,Unity3d,我正在开发unity build(exe)并尝试实现这样一种算法,该算法会在特定时间后(例如,一周或一个月后)使我的播放器过期。下面是完整的测试代码,但有一个小问题(实际上是大问题): public类locallimiteddaysicense:monobhavior { 浮动天数=3; 公共字符串currentDate; 布尔信息; 无效唤醒() { 字符串playerPrefKeyName=“PlayerStartDateKey”; currentDate=DateTime.Now.ToSt

我正在开发unity build(exe)并尝试实现这样一种算法,该算法会在特定时间后(例如,一周或一个月后)使我的播放器过期。下面是完整的测试代码,但有一个小问题(实际上是大问题):

public类locallimiteddaysicense:monobhavior
{
浮动天数=3;
公共字符串currentDate;
布尔信息;
无效唤醒()
{
字符串playerPrefKeyName=“PlayerStartDateKey”;
currentDate=DateTime.Now.ToString();
字符串playerStartDate=PlayerPrefs.GetString(playerPrefKeyName,“”);
如果(!PlayerPrefs.HasKey(playerPrefKeyName))
{
Log(“播放器开始日期设置”);
PlayerPrefs.SetString(playerPrefKeyName,currentDate);
}
其他的
{
Log(“播放器开始日期已设置”);
}
字符串playerPrefsSaveDate=PlayerPrefs.GetString(playerPrefKeyName);
DateTime today=DateTime.Now;
DateTime PlayerFirstativeDate=Convert.ToDateTime(PlayerPrefs.GetString(playerPrefKeyName));
DateTime playerLimitDate=playerFirstativeDate.AddDays(numberOfDays);
if(DateTime.Compare(今天,playerLimitDate)>0)//确认
{
Time.timeScale=0;
isShowExpiryMessage=true;
}
if(DateTime.Compare(今天,playerFirstativeDate)<0)//确认用户没有更改系统的日期
{
Time.timeScale=0;
isShowExpiryMessage=true;
}
}
void OnGUI()
{
如果(isShowExpiryMessage)
{
标签(新的Rect((Screen.width/2)-100,Screen.height/2300100),“对不起,exe已经过期了!”;
}
}
}

如果在构建过程中经过了某些天,它确实会停止程序,但问题是,如果用户删除了旧的构建并再次安装了构建,那么它将再次允许三天

1.创建将日期注册到服务器数据库的web API


2.创建另一个API,根据玩家的过期逻辑返回true或false,并在每次游戏开始时启动该API。

无法仅从客户端控制该API

顺便说一句,您的检查逻辑中还有一个更简单的缺陷:用户只需更改机器上的日期即可

不要试图通过仅信任来自客户端的信息来强制实施安全功能。特别是那些可以在服务器端简单检查的东西

正如所建议的,您应该实现一些服务器端检查

(如果你想防止黑客攻击此保护,你还应该通过正确的身份验证和消息签名来保护通信。当然,这取决于你愿意保护你的软件免受哪个“技术级别”用户的攻击。)

public class LocalLimitedDaysLicense : MonoBehaviour
{

    float numberOfDays = 3;
    public string currentDate;
    bool isShowExpiryMessage;

    void Awake()
    {
        string playerPrefKeyName = "PlayerStartDateKey";

        currentDate = DateTime.Now.ToString();

        string playerStartDate = PlayerPrefs.GetString(playerPrefKeyName, "");

        if (!PlayerPrefs.HasKey(playerPrefKeyName))
        {
            Debug.Log("Player Start Date Setting");
            PlayerPrefs.SetString(playerPrefKeyName, currentDate);
        }
        else
        {
            Debug.Log("Player Start Date already Set");
        }


        string playerPrefsSaveDate = PlayerPrefs.GetString(playerPrefKeyName);

        DateTime today = DateTime.Now;




        DateTime playerFirstActiveDate = Convert.ToDateTime(PlayerPrefs.GetString(playerPrefKeyName));
        DateTime playerLimitDate = playerFirstActiveDate.AddDays(numberOfDays);


        if (DateTime.Compare(today, playerLimitDate) > 0)//confirm that 
        {
            Time.timeScale = 0;
            isShowExpiryMessage = true;
        }

        if (DateTime.Compare(today, playerFirstActiveDate) < 0)//Confirm that user didn't change the date of system
        {
            Time.timeScale = 0;
            isShowExpiryMessage = true;
        }
    }

    void OnGUI()
    {
        if (isShowExpiryMessage)
        {
            GUI.Label(new Rect((Screen.width / 2) - 100, Screen.height / 2, 300, 100), "Sorry the exe has expired.!");
        }
    }
}