using System; using System.Collections; using UnityEngine; using UnityEngine.UI; public class Test : MonoBehaviour { private bool inProgress; private DateTime TimerStart; private DateTime TimerEnd; private Coroutine lastTimer; private Coroutine lastDisplay; [Header("Production time")] public int Days; public int Hours; public int Minutes; public int Seconds; [Header("UI")] [SerializeField] private GameObject window; [SerializeField] private Text startTimeText; [SerializeField] private Text endTimeText; [SerializeField] private GameObject timeLeftObj; [SerializeField] private Text timeLeftText; [SerializeField] private Slider timeLeftSlider; [SerializeField] private Button skipButton; [SerializeField] private Button startButton; #region Unity methods private void Awake() { SaveData.current = (SaveData) SerializationManager.Load(Application.persistentDataPath + "/saves/save1.save"); } private void Start() { window.SetActive(false); startButton.onClick.AddListener(StartTimer); skipButton.onClick.AddListener(Skip); if (!String.IsNullOrEmpty(SaveData.current.testData.timeStart)) { TimerStart = DateTime.Parse(SaveData.current.testData.timeStart); TimerEnd = DateTime.Parse(SaveData.current.testData.timeEnd); lastTimer = StartCoroutine(Timer()); inProgress = true; } } private void OnDestroy() { SerializationManager.Save("save1", SaveData.current); Debug.Log("Saved"); } #endregion #region UI methods private void InitializeWindow() { if (inProgress) { startTimeText.text = "Start Time: \n" + TimerStart; endTimeText.text = "End Time: \n" + TimerEnd; timeLeftObj.SetActive(true); lastDisplay = StartCoroutine(DisplayTime()); startButton.gameObject.SetActive(false); skipButton.gameObject.SetActive(true); } else { startTimeText.text = "Start Time:"; endTimeText.text = "End Time:"; timeLeftObj.SetActive(false); } } private IEnumerator DisplayTime() { DateTime start = DateTime.Now; TimeSpan timeLeft = TimerEnd - start; double totalSecondsLeft = timeLeft.TotalSeconds; double totalSeconds = (TimerEnd - TimerStart).TotalSeconds; string text; while (window.activeSelf && timeLeftObj.activeSelf) { text = ""; timeLeftSlider.value = 1 - Convert.ToSingle((TimerEnd - DateTime.Now).TotalSeconds / totalSeconds); if (totalSecondsLeft > 1) { if (timeLeft.Days != 0) { text += timeLeft.Days + "d "; text += timeLeft.Hours + "h"; yield return new WaitForSeconds(timeLeft.Minutes * 60); } else if (timeLeft.Hours != 0) { text += timeLeft.Hours + "h "; text += timeLeft.Minutes + "m"; yield return new WaitForSeconds(timeLeft.Seconds); } else if (timeLeft.Minutes != 0) { TimeSpan ts = TimeSpan.FromSeconds(totalSecondsLeft); text += ts.Minutes + "m "; text += ts.Seconds + "s"; } else { text += Mathf.FloorToInt((float) totalSecondsLeft) + "s"; } timeLeftText.text = text; totalSecondsLeft -= Time.deltaTime; yield return null; } else { timeLeftText.text = "Finished"; skipButton.gameObject.SetActive(false); timeLeftSlider.value = 1; inProgress = false; break; } } yield return null; } public void OpenWindow() { window.SetActive(true); InitializeWindow(); } public void CloseWindow() { window.SetActive(false); } #endregion #region Timed event private void StartTimer() { TimerStart = DateTime.Now; TimeSpan time = new TimeSpan(Days, Hours, Minutes, Seconds); TimerEnd = TimerStart.Add(time); inProgress = true; SaveData.current.testData = new TestData(TimerStart, TimerEnd); lastTimer = StartCoroutine(Timer()); InitializeWindow(); } private IEnumerator Timer() { DateTime start = DateTime.Now; double secondsToFinished = (TimerEnd - start).TotalSeconds; yield return new WaitForSeconds(Convert.ToSingle(secondsToFinished)); inProgress = false; Debug.Log("Finished"); } private void Skip() { TimerEnd = DateTime.Now; inProgress = false; SaveData.current.testData.timeEnd = TimerEnd.ToString(); StopCoroutine(lastTimer); timeLeftText.text = "Finished"; timeLeftSlider.value = 1; StopCoroutine(lastDisplay); skipButton.gameObject.SetActive(false); startButton.gameObject.SetActive(true); } #endregion }