我在 Unity 中使用了 C# 秒表 Class,但它 returns 仅 00:00:00

I used the C# Stopwatch Class in Unity, but it returns only 00:00:00

我想测量 return 用户按下 Tab 键和 Space 按钮之间经过的时间。不幸的是我的代码只有 returns 00:00:00。到目前为止,这是我的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System;
using System.Diagnostics;
using Debug=UnityEngine.Debug;
public class timer : MonoBehaviour {
    public Stopwatch zeit;
    void Update () {
        zeit = new Stopwatch();
        if (Input.GetKeyDown ("tab")) {
            zeit.Start();
        }

        if (Input.GetKeyDown ("space")){
            TimeSpan ts = zeit.Elapsed;
            zeit.Stop ();
            print(ts);
            zeit.Reset ();
        }
    }
}
    

您在调用更新时正在重新创建秒表。您可以在 "constructor".

中初始化正手秒表
public Stopwatch zeit = new StopWatch();
void Update () {
    if (Input.GetKeyDown ("tab")) {
        zeit.Start();
    }

    if (Input.GetKeyDown ("space")){
        TimeSpan ts = zeit.Elapsed;
        zeit.Stop ();
        print(ts);
        zeit.Reset ();
    }
}

您必须将 Stopwatch 的实例移到 Update 之外。目前,您每帧都在重新创建秒表。

所以将 zeit = new Stopwatch(); 移到 Update

之外
private readonly Stopwatch zeit;

void Start() 
{
    zeit = new Stopwatch();
}

void Update()
{
  //...
}

您在每个更新方法中创建了新的秒表:

void Update () {
    zeit = new Stopwatch();

不要那样做,而是尝试这种方法:

private readonly Stopwatch _zeit = new Stopwatch();

void Update ()
{
    if (Input.GetKeyDown ("tab"))
    {
        _zeit.Restart();
    }

    if (Input.GetKeyDown ("space")
    {
        print(_zeit.Elapsed);
    }
}

我认为问题在于您总是创建一个新对象并将其设置到 zeit 变量中,每个 Update 函数被引发。

因此,您只能创建该对象一次。

public Stopwatch zeit = new Stopwatch();
    void Update () {
        if (Input.GetKeyDown ("tab")) {
            zeit.Start();
        }

        if (Input.GetKeyDown ("space")){
            TimeSpan ts = zeit.Elapsed;
            zeit.Stop ();
            print(ts);
            zeit.Reset ();
        }
    }

应该先停下来。

if (Input.GetKeyDown ("space")){
  //TimeSpan ts = zeit.Elapsed;
  zeit.Stop ();
  //print(ts);
  print(zeit.Elapsed);
  zeit.Reset ();
}