如果System.DateTime.Now大于PlayerPrefs值,则加载场景

时间:2018-02-12 10:00:45

标签: c# unity3d unity5

我正在尝试进行简单的日期时间检查。我相信我的逻辑是正确的,但不是我这样做的方式。

我想要做的是当用户启动应用程序时我想检查它是否是第一次启动它。如果这是我第一次存储系统日期时间,如果应用程序已经运行,那么时间已经存储在PlayerPrefs中,如此:

    int timecheck;
            void Start()
            {
                 timecheck = PlayerPrefs.GetInt("savedFirstRun"); //Get time check value

                if (timecheck != 1) { 
                    PlayerPrefs.SetString("rewardCountDown", System.DateTime.Now.ToBinary().ToString());
                    timecheck = 1;
                    PlayerPrefs.SetInt("savedFirstRun", timecheck);// set time check value
                }                    
            }

然后我将存储的系统时间"rewardCountDown",并将字符串转换为日期时间。然后我将等待时间添加到此日期,在此示例中我添加了一分钟。

 DateTime temp = Convert.ToDateTime(PlayerPrefs.GetString("rewardCountDown"));

        //Convert the old time from binary to a DataTime variable
        storedDate = temp;

        storedDate.AddMinutes(1);

    }

然后我轮询更新方法以继续检查system.time.now是否大于存储时间。

    void Update()
    {
        dateNow = System.DateTime.Now;
        if (dateNow > storedDate)
        {
            Canvas2.SetActive(true);            
            SceneManager.LoadScene("Home 4", LoadSceneMode.Single);
        }
    }

我预计在等待一分钟之后,场景管理员会开火并加载下一个场景。但场景永远不会加载。

我的问题是我做错了什么?我想它可能是如何将datetime存储为PlayerPref。

3 个答案:

答案 0 :(得分:0)

有一个明显的问题:storedDate.AddMinutes(1);并没有改变StoredDate的价值......这是一个常见的容易错过的问题

storedDate = storedDate.AddMinutes(1);

虽然我本来希望立即加载场景,但根本没有完成。奖励金额在哪里设定?您的代码中没有设置。

答案 1 :(得分:0)

以下是我在处理游戏中处理日期的方式。

由于我的统计数据原生于long而非日期,我将日期时间编码为整数值,以便可以明确地解析它。

long nl = long.Parse(DateTime.Now.ToString("yyMMddHHmm")); //now
long ll = StatisticsTracker.lastDailyLogin.value; //saved value
if(ll > 0) {
    DateTime nowLogin = DateTime.ParseExact(nl.ToString(), "yyMMddHHmm", CultureInfo.InvariantCulture); //is this unnecessary? Probably. But this shows both halves of the encoding / decoding process.
    DateTime lastLogin = DateTime.ParseExact(ll.ToString(), "yyMMddHHmm", CultureInfo.InvariantCulture);
    //do stuff
}

此处生成的长值可以轻松存储在PlayerPref中。

将我的代码与您的代码进行比较,看起来您将日期编码为带有.ToBinary()的二进制字符串,但是当您解析时,您无法将其解析为作为二进制字符串。我建议选择一种格式(就像我一样)并使用该格式进行转换和解析。

答案 2 :(得分:0)

可能就像使用DateTime对象解析日期时间一样简单。这可能值得一试:

        DateTime temp = DateTime.Parse(PlayerPrefs.GetString("rewardCountDown"));

        //Convert the old time from binary to a DataTime variable
        storedDate = temp;

        storedDate.AddMinutes(1);

因为您使用默认的ToString()序列化日期,所以解析它会导致您的日期通过Parse()转换回DateTime对象而没有格式。

如果仍然无效,请通过将其写入控制台来检查您的PlayerPrefs中的字符串是什么 - 然后将格式传递给ParseExact()调用以及字符串,例如。

    CultureInfo provider = CultureInfo.InvariantCulture;

    var temp = DateTime.ParseExact(PlayerPrefs.GetString("rewardCountDown"),"yyyy-MM-dd HH:mm:ss", provider);

    storedDate = temp;

您需要确保您使用的格式与您的序列化字符串完全匹配,但这应该可以解决问题。

更多信息:

https://msdn.microsoft.com/en-us/library/w2sa9yss(v=vs.110).aspx

在这里:

https://msdn.microsoft.com/en-us/library/system.datetime.parse(v=vs.110).aspx