Как я могу изменить время, оставшееся в таймере в режиме реального времени, пока он работает? - PullRequest
0 голосов
/ 27 сентября 2018
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Timers;
using System.Diagnostics;
using System.Threading;

public class Auto : EditorWindow
{
    private double next = 0;
    private double time = 0;
    private bool stop;
    private bool pause;
    private bool reset = false;
    private bool waitForUI = false;
    private bool minimizeToZero;
    private static Auto editor;
    private static int width = 300;
    private static int height = 120;
    private static int x = 0;
    private static int y = 0;
    private System.Timers.Timer timer;
    private int h = 5, m = 33, s = 5;
    private static float next = 0.0f;

    [MenuItem("Window/Auto")]
    static void ShowEditor()
    {
        editor = EditorWindow.GetWindow<Auto>();
        editor.Init();

        CenterWindow();
    }

    public void Init()
    {
        timer = new System.Timers.Timer();
        timer.Interval = 1000;//1s
        timer.Elapsed += T_Elapsed;
        timer.Start();
    }

    private void T_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (s == 0)
        {
            s = 60;
            m -= 1;
        }
        if (m == 0)
        {
            m = 60;
            h -= 1;
        }

        s -= 1;
    }

    void OnGUI()
    {
        minimizeToZero = GUILayout.Toggle(minimizeToZero, "Minimize To Zero");

        if (pause)
        {
            GUI.enabled = false;
        }
        else
        {
            GUI.enabled = true;
        }
        stop = GUILayout.Toggle(stop, "Stop");

        if (stop)
        {
            GUI.enabled = false;
        }
        else
        {
            GUI.enabled = true;
        }
        pause = GUILayout.Toggle(pause, "Pause");
        GUILayout.Space(10);

        if (minimizeToZero)
        {
            MinimizeWindow();
        }
        else
        {
            CenterWindow();
        }

        next = EditorGUILayout.Slider(next, 1, 100);
        string t = string.Format("{0}:{1}:{2}", h.ToString().PadLeft(2, '0'), m.ToString().PadLeft(2, '0'), s.ToString().PadLeft(2, '0'));
        EditorGUILayout.LabelField("Next: ", t);

        if (stop)
        {
            timer.Stop();
            reset = true;
        }
        else
        {
            if (reset)
            {
                timer.Start();
                h = 5;
                m = 33;
                s = 5;
                reset = false;
            }
        }

        if (pause)
        {
            timer.Stop();
        }
        else
        {
            timer.Start();
        }
    }
}

У меня есть следующая переменная, которую я использую с ней для ползунка:

next = EditorGUILayout.Slider(next, 1, 100);

Что я хочу сделать, это при изменении значения ползунка, когда таймер работает, изменение в реальном временивремя одно из значений таймера, например, переменная s (секунды), и каждый раз, когда оно меняет значение s, таймер отсчитывается от текущего нового значения секунд.Или если это m (минуты) или h (часы).

Если после строки:

next = EditorGUILayout.Slider(next, 1, 100);

Я делаю:

s = (int)next;

Таймерникогда не начнет работать.То, что я хочу сделать, это изменить таймер обратного отсчета значения / с в режиме реального времени и продолжать отсчет с текущего изменения нового значения.Не останавливать таймер и начинать все сначала, а продолжать работать со следующего измененного значения / с.

1 Ответ

0 голосов
/ 27 сентября 2018

Эти переменные следует устанавливать только в случае изменения ползунка.

EditorGUI.BeginChangeCheck();
next = EditorGUILayout.Slider(next, 1, 100);
if(EditorGUI.EndChangeCheck())
{
    //set h/m/s here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...