C# 如何在返回0之前停止显示60秒

C# 如何在返回0之前停止显示60秒,c#,unity3d,C#,Unity3d,我试图在播放器的UI中显示时间,但在返回0之前,我似乎无法停止显示60秒。我原以为它会在显示任何内容之前先执行if语句中的所有操作,但事实似乎并非如此。这是我的密码: private void Update() { seconds += timeMultiplier * Time.deltaTime; if (seconds >= 60) { seconds -= 60; minutes += 1; } else if (minu

我试图在播放器的UI中显示时间,但在返回0之前,我似乎无法停止显示60秒。我原以为它会在显示任何内容之前先执行if语句中的所有操作,但事实似乎并非如此。这是我的密码:

private void Update() {

    seconds += timeMultiplier * Time.deltaTime;

    if (seconds >= 60) {
        seconds -= 60;
        minutes += 1;
    } else if (minutes >= 60) {
        minutes -= 60;
        hours += 1;
    } else if (hours >= 24) {
        hours -= 24;
        days += 1;
    } else if (days >= 7) {
        days -= 7;
        weeks += 1;
    } else if (weeks >= 52.17857f) {
        weeks -= 52.17857f;
        years += 1;
    }

}

public string DisplayTimeInformation() {
    StringBuilder builder = new StringBuilder();

    builder.Append(hours.ToString("#00")).Append(":").Append(minutes.ToString("#00"));

    if (displaySeconds) {
        builder.Append(":").Append(seconds.ToString("#00")).Append(" ");
    } else {
        builder.Append(" ");
    }

    return builder.ToString();
}

我尝试使用第二个
displayedSeconds
变量,该变量与正常的
seconds
变量相同,并将其钳制为59,尽管从技术上讲它仍然准确,它会在59上停留一段时间,然后从00加速到01,然后再恢复正常,这看起来不太好。

不需要计算所有这些时间属性。记录某事开始的时间要容易得多:

var startedOn = DateTime.Now;
然后每次显示持续时间时,请执行以下操作:

var difference = DateTime.Now - startedOn;
这为您提供了一个漂亮的
TimeSpan
对象,您可以轻松显示:

var timeInString = difference.ToString(@"hh\:mm\:ss");

有关如何指定自己的格式字符串,请参阅。

无需计算所有这些时间属性。记录某事开始的时间要容易得多:

var startedOn = DateTime.Now;
然后每次显示持续时间时,请执行以下操作:

var difference = DateTime.Now - startedOn;
这为您提供了一个漂亮的
TimeSpan
对象,您可以轻松显示:

var timeInString = difference.ToString(@"hh\:mm\:ss");

有关如何指定自己的格式字符串,请参阅。

使用TimeSpan进行计算更容易。您可以使用此类根据deltaTime和Time乘法器获取小时、分钟和秒:

 public class Timer
    {
        public int Seconds => timeSpan.Seconds;

        public int Minutes => timeSpan.Minutes;

        public int Hours => timeSpan.Hours;

        private TimeSpan timeSpan;

        public void Update(double timeMultiplier, double deltaTime)
        {
            timeSpan = timeSpan.Add(TimeSpan.FromSeconds(timeMultiplier * deltaTime));

            Console.WriteLine(timeSpan.ToString(@"hh\:mm\:ss"));
        }
    }

使用时间跨度进行计算更容易。您可以使用此类根据deltaTime和Time乘法器获取小时、分钟和秒:

 public class Timer
    {
        public int Seconds => timeSpan.Seconds;

        public int Minutes => timeSpan.Minutes;

        public int Hours => timeSpan.Hours;

        private TimeSpan timeSpan;

        public void Update(double timeMultiplier, double deltaTime)
        {
            timeSpan = timeSpan.Add(TimeSpan.FromSeconds(timeMultiplier * deltaTime));

            Console.WriteLine(timeSpan.ToString(@"hh\:mm\:ss"));
        }
    }

为什么还要计算这些呢?只需记录开始的时间(
var startedOn=DateTime.Now;
),然后每次显示持续时间时都执行
var difference=DateTime.Now-startedOn
提供了一个很好的
TimeSpan
对象,您可以轻松地显示它。您所展示的两种方法几乎肯定是在不同的线程上运行的。如果你必须这样做,而不是@DavidG建议的方式(或类似的方式),你可能需要以某种方式同步它们。发布的两种方法必须同步,以便在时间设置回零之前不会显示。与其他人所说的一样,如果你仍然想使用自己的计算,还有一些其他问题。例如,if-else-if--逻辑也会显示60分钟,因为如果在同一个周期中更新秒数,则不会更新分钟数。顺便说一句,这些年的代码在闰年中不会运行得很好……为什么还要计算所有这些?只需记录开始的时间(
var startedOn=DateTime.Now;
),然后每次显示持续时间时都执行
var difference=DateTime.Now-startedOn
提供了一个很好的
TimeSpan
对象,您可以轻松地显示它。您所展示的两种方法几乎肯定是在不同的线程上运行的。如果你必须这样做,而不是@DavidG建议的方式(或类似的方式),你可能需要以某种方式同步它们。发布的两种方法必须同步,以便在时间设置回零之前不会显示。与其他人所说的一样,如果你仍然想使用自己的计算,还有一些其他问题。if-else-if--逻辑也会显示60分钟,因为如果在同一个周期中更新秒数,则不更新分钟数。顺便说一句,这些年的代码在闰年中不会运行得很好……我还是个新手,如果我做了任何不必要的事,很抱歉。我看了一下你发布的链接,你建议的方法似乎是个好主意,但我正在尝试建立一个游戏时间系统,而不是一个与电脑系统时间同步的系统。第一个
seconds+=timeMultiplier*Time.deltaTime行让我把时间乘数改为,比如说,4,这样即使刻度(?)是正确的,时间也会以4倍的速度流逝,所以玩家实际上不必等待一整天,直到晚上才轮到活动或类似的事情。我还是很新,如果我做了不必要的事情,很抱歉。我看了一下你发布的链接,你建议的方法似乎是个好主意,但我正在尝试建立一个游戏时间系统,而不是一个与电脑系统时间同步的系统。第一个
seconds+=timeMultiplier*Time.deltaTime行让我将时间乘数改为,比如说,4,这样即使刻度(?)正确,时间也只会以4倍的速度流逝,所以玩家实际上不必等待一整天,就可以将事件或类似事件的时间变为夜间。