在游戏中,我想每晚午夜触发一个事件。以下代码无效:
void Update()
{
var tomorrow = DateTime.Now.AddDays(1).ToShortDateString();
var today = DateTime.Now.ToShortDateString();
if (tomorrow == today)
{
THE THING I WANT TO HAPPEN AT MIDNIGHT;
}
}
在调试中我发现我想要发生的事情很好。但是,事件不是从if语句触发的。
我搜索了档案中的答案,并找到了一些,但解决方案无效 - 由于我极低的编程知识,这几乎肯定是一个简单的错误。
任何帮助都会很棒......谢谢!
答案 0 :(得分:2)
您的代码有效地询问" 1 == 1 + 1
?"答案永远不会。
您需要将上次执行日期保存在方法之外,并且还需要更加谨慎地进行比较。例如,DateTime.Now == DateTime.Now
可能会返回false(并且经常会),因为DateTime
将时间存储到刻度,如果它被一个刻度线关闭,它不会被认为是平等的。
试试这个:
DateTime lastExecutionDate = DateTime.Utc;
void Update()
{
var tomorrow = DateTime.Now.AddDays(1).ToShortDateString();
var now = DateTime.Utc;
if (lastExecutionDate.Day < now.Day)
{
lastExecutionDate = now;
// this code will be called as close to midnight as unity allows.
}
}
我不确定游戏开始时是否会立即考虑午夜。如果是,请尝试将其用于lastExecutionDate
而不是......
DateTime lastExecutionDate = DateTime.UtcNow + TimeSpan.FromDays(1);
答案 1 :(得分:0)
if (tomorrow == today)
这永远不会成真。如果它完全午夜(Jan 01 2000 12:00:00.0000
),那么这一行:tomorrow = DateTime.Now.AddDays(1)
将等于午夜... 明天,所有时间({{1} }})。这同样适用于所有其他日期时间。
您最好先检查当前的时间是否在午夜,然后将当前的日期存储在某个地方,并Jan 02 2000 12:00:00.0000
仅存储&#{ 39; s当前是午夜,存储日期不是今天的日期。
当然,这也忽略了&#34;如果应用程序未在午夜主动运行,您是否希望追溯触发事件。&#34;在这种情况下,DoTheThing()
和TimeSpan
可能会引起关注。