首页 > 解决方案 > 如何在 EditorWindow 中暂停/继续计时器?

问题描述

void OnGUI()
    {
        pauseCounting = GUILayout.Toggle(pauseCounting, "Pause timer");
        Timer();
    }

然后:

private void Timer()
    {
        if (stopCounting == false)
        {
            EditorGUILayout.LabelField("Count Each:", countTime + " Secs");

            if (waitForUI)
                timeToCount = nextCountTime - EditorApplication.timeSinceStartup;

            EditorGUILayout.LabelField("Next Count:", timeToCount.ToString() + " Sec");
            if (waitForUI == false)
            {
                timeToCount = 30;
                waitForUI = true;
            }

            this.Repaint();

            if (EditorApplication.timeSinceStartup > nextCountTime)
            {
                nextCountTime = EditorApplication.timeSinceStartup + countTime;
            }

        }
        else
        {
            EditorGUILayout.LabelField("Counting:", countTime + " Secs");
            EditorGUILayout.LabelField("Next Count:", countToSave.ToString() + " Sec");
        }
    }

问题是我现在正在使用 EditorApplication.timeSinceStartup ,如果我将标志 stopCounting 更改为 true 然后返回 false ,它将使用 EditorApplication.timeSinceStartup 进行计算,并且不会从停止点继续。我希望如果 stopCounting 为 true,则 false 再次继续从上次暂停开始的时间。

标签: c#unity3d

解决方案


在您的班级中,添加一个字段来记录总滴答时间:

double timerRecord;

在你的 onEnable 中,初始化它:

timerRecord = EditorApplication.timeSinceStartup;

在您的 OnGUI() 中,添加一些逻辑来检查“重启”操作:

var shouldStop = GUILayout.Toggle(stopCounting, "Pause timer");
if(!shouldStop && stopCounting)
{
    // in this case, you restarted the timer.
    timerRecord = EditorApplication.timeSinceStartup;
}
stopCounting = shouldStop;
Timer();

最后在您的 Time() 中,将所有 'EditorApplication.timeSinceStartup' 替换为 'timerRecord',最后,将 'timerRecord' 的值更新为 'EditorApplication.timeSinceStartup'。

timerRecord = EditorApplication.timeSinceStartup;

推荐阅读