我在 Unity 中使用了 C# 秒表类,但它只返回 00:00:00

Posted

技术标签:

【中文标题】我在 Unity 中使用了 C# 秒表类,但它只返回 00:00:00【英文标题】:I used the C# Stopwatch Class in Unity, but it returns only 00:00:00 【发布时间】:2018-02-05 11:22:40 【问题描述】:

我想测量并返回用户按下 Tab 和 Space 按钮之间的时间。不幸的是,我的代码只返回 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 ();
        
    

    

【问题讨论】:

您正在为每一帧创建一个新的Stopwatch。您想将zeit = new Stopwatch(); 移到Update 之外(例如在Start 中?) 【参考方案1】:

应该先停下来。

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

【讨论】:

无需停止即可获取经过的时间。【参考方案2】:

我认为问题在于您总是创建一个新对象并将其设置到 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 ();
        
    

【讨论】:

【参考方案3】:

您为每个更新方法创建新的秒表:

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);
    

【讨论】:

【参考方案4】:

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

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

private readonly Stopwatch zeit;

void Start() 

    zeit = new Stopwatch();


void Update()

  //...

【讨论】:

【参考方案5】:

调用更新时,您正在重新创建秒表。您可以在“构造函数”中初始化正手秒表。

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 ();
    

【讨论】:

以上是关于我在 Unity 中使用了 C# 秒表类,但它只返回 00:00:00的主要内容,如果未能解决你的问题,请参考以下文章

我在 Angular 中使用动态编译器,但它只适用于视图引擎,但不推荐使用视图引擎

使用 TransferSpreadsheet 导入 Excel 电子表格时出错

C++ DLL 和 C# Unity 之间的集成

csharp Unity系统诊断秒表

BackgroundWorker使用秒表更新经过的时间标签,由于调用C#而冻结[重复]

C# 简单秒表 - 初学者