Unity3d实时计数器在背景中

时间:2015-03-26 07:58:17

标签: c# timer unity3d

我正在制作一款有能量棒的游戏 酒吧将拥有最多25个能量。当用户消耗能量时,每个“点”应在3分钟内重新填充(从空状态到完全能量棒25x3min = 75min)。

现在,如何在每个场景中实现计时器,甚至在游戏关闭时?

谢谢。

2 个答案:

答案 0 :(得分:2)

我认为解决这个问题的最佳方法是使用实​​际时间,将开始时间保存在外部文件中,并在游戏重新开始时重新计算能量等级。

答案 1 :(得分:1)

如果您想在游戏关闭时进行计数,那么您将不得不使用系统时钟而不是(比如)Time.time或类似时间。

因此,您需要经常检查时间,当您这样做时,计算从现在到您上次检查之间的经过时间。

然后将其乘以一个充值因子,将其加到您的能量水平并存储当前时间。

以秒为单位获取当前时间......

DateTime epochStart = new System.DateTime(1970, 1, 1, 8, 0, 0, System.DateTimeKind.Utc);

double timestamp = (System.DateTime.UtcNow - epochStart).TotalSeconds;

...所以你所做的所有工作的代码片段可能如下所示:

double LastTimeChecked = 0;
double EnergyAccumulator;
int Energy;

const double EnergyRefillSpeed = 1 / (60*3);
const int EnergyMax = 25;

double TimeInSeconds()
{
    DateTime epochStart = new System.DateTime(1970, 1, 1, 8, 0, 0, System.DateTimeKind.Utc);
    double timestamp = (System.DateTime.UtcNow - epochStart).TotalSeconds;

    return timestamp;
}

// call this whenever you can!
void update()
{
    double TimeNow = TimeInSeconds();
    double TimeDelta = 0;

    // if we have updated before...
    if( LastTimeChecked != 0 )
    {
        // get the time difference between now and last time
        TimeDelta = TimeNow - LastTimeChecked;

        // multiply by our factor to increase energy.
        EnergyAccumulator += TimeDelta * EnergyRefillSpeed;

        // get the whole points accumulated so far
        int EnergyInt = (int) EnergyAccumulator;

        // remove the whole points we've accumulated
        if( EnergyInt > 0 )
        {
            Energy += EnergyInt;
            EnergyAccumulator -= EnergyInt;
        }

        // cap at the maximum
        if( Energy > EnergyMax )
            Energy = EnergyMax;
    }

    // store the last time we checked
    LastTimeChecked = TimeNow;

}

(请注意,这个编译,但我没有正确检查,希望你得到要点!)

此外,您需要将LastTimeChecked变量保存到磁盘并在运行之间重新加载,以便在游戏运行时能量累积。