RandomGFGoStop/Assets/Scripts/SingletonManagers/Managers/TimerManager.cs

746 lines
24 KiB
C#
Raw Normal View History

2025-08-27 21:08:17 +00:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using System;
using System.Text;
using System.Threading;
using System.IO;
using Newtonsoft.Json;
using DG.Tweening.Core.Easing;
public class TimerManager : MonoBehaviour
{
public UnityEvent<int> onChangeActionTimerCount;
public UnityEvent<int> onChangeRewardActionCount;
int _actionTimerValue = 0;
public int ActionTimerValue
{
get { return _actionTimerValue; }
}
int _addActionCount;
private DateTime loadTime;
private enum TimerType
{
None,
Simple,
Hierarchy,
}
private class TimerInfo
{
public int time = 0;
public int limiteTimerCount = 0;
public DateTime saveTimeData = DateTime.Now;
public UnityAction<int> OnPassedTime;
protected TimerType timerType = TimerType.None;
public TimerType Type
{
get { return timerType; }
}
protected string ownerName = "";
public string OwnerName
{
get { return ownerName; }
}
public TimerInfo()
{
}
public TimerInfo(TimerType type, string ownerName, int time, DateTime saveTimeData)
{
timerType = type;
this.ownerName = ownerName;
this.time = time;
this.saveTimeData = saveTimeData;
}
}
private class SimpleTimerInfo : TimerInfo
{
public UnityAction<int> OnStartTimer;
public UnityAction<int> OnPauseTimer;
public UnityAction<int> OnStopTimer;
public SimpleTimerInfo()
{
}
public SimpleTimerInfo(string ownerName)
{
timerType = TimerType.Simple;
this.ownerName = ownerName;
}
public SimpleTimerInfo(string ownerName, int time, DateTime timeData, UnityAction<int> OnStartTimer, UnityAction<int> OnPauseTimer, UnityAction<int> OnStopTimer, UnityAction<int> OnPassedTime)
{
timerType = TimerType.Simple;
this.ownerName = ownerName;
this.time = time;
this.saveTimeData = timeData;
this.OnStartTimer += OnStartTimer;
this.OnPauseTimer += OnPauseTimer;
this.OnStopTimer += OnStopTimer;
this.OnPassedTime += OnPassedTime;
}
public void ResetEvent()
{
this.OnStartTimer = null;
this.OnPauseTimer = null;
this.OnStopTimer = null;
this.OnPassedTime = null;
}
}
private class HierarchyTimerInfo : TimerInfo
{
public int limiteHierarchyCount = 0;
public UnityAction<int, int> OnStartTimer;
public UnityAction<int, int> OnPauseTimer;
public UnityAction<int> OnStopTimer;
public HierarchyTimerInfo()
{
}
public HierarchyTimerInfo(string ownerName)
{
timerType = TimerType.Hierarchy;
this.ownerName = ownerName;
}
public HierarchyTimerInfo(string ownerName, int time, DateTime timeData, UnityAction<int, int> OnStartTimer, UnityAction<int, int> OnPauseTimer, UnityAction<int> OnStopTimer, UnityAction<int> OnPassedTime)
{
timerType = TimerType.Hierarchy;
this.ownerName = ownerName;
this.time = time;
this.saveTimeData = timeData;
this.OnStartTimer += OnStartTimer;
this.OnPauseTimer += OnPauseTimer;
this.OnStopTimer += OnStopTimer;
this.OnPassedTime += OnPassedTime;
}
public void ResetEvent()
{
this.OnStartTimer = null;
this.OnPauseTimer = null;
this.OnStopTimer = null;
this.OnPassedTime = null;
}
}
StringBuilder sb = new StringBuilder();
Dictionary<string, TimerInfo> timerInfoDictionary = new Dictionary<string, TimerInfo>();
private Coroutine timerCoroutine = null;
private WaitForSecondsRealtime waitForSeconds = null;
private void Awake()
{
LoadAllTimerInfo();
}
private void SaveSimpleTimerInfo()
{
foreach (KeyValuePair<string, TimerInfo> dic in timerInfoDictionary)
{
sb.Clear();
sb.Append(dic.Key).Append("TimerData");
SimpleTimerInfo info = timerInfoDictionary[dic.Key] as SimpleTimerInfo;
if (info != null)
{
info.saveTimeData = DateTime.Now;
ES3.Save<SimpleTimerInfo>(sb.ToString(), info, "TimerData.json");
}
}
}
private void SaveHierarchyTimerInfo()
{
foreach (KeyValuePair<string, TimerInfo> dic in timerInfoDictionary)
{
sb.Clear();
sb.Append(dic.Key).Append("TimerData");
HierarchyTimerInfo info = timerInfoDictionary[dic.Key] as HierarchyTimerInfo;
if (info != null)
{
info.saveTimeData = DateTime.Now;
ES3.Save<HierarchyTimerInfo>(sb.ToString(), info, "TimerData.json");
}
}
}
private void LoadAllTimerInfo()
{
if (ES3.KeyExists("TimerData.json"))
{
TimerInfo info = new TimerInfo();
info = ES3.Load<TimerInfo>("TimerData.json");
timerInfoDictionary.Add(info.OwnerName, info);
}
}
private void LoadSimpleTimerInfo(string ownerName)
{
sb.Clear();
sb.Append(ownerName).Append("TimerData");
if (ES3.KeyExists(sb.ToString(), "TimerData.json"))
{
SimpleTimerInfo info = new SimpleTimerInfo(ownerName);
info = ES3.Load<SimpleTimerInfo>(sb.ToString(), "TimerData.json");
info.ResetEvent();
if (timerInfoDictionary.ContainsKey(ownerName) == false)
{
timerInfoDictionary.Add(ownerName, info);
}
else
{
timerInfoDictionary.Remove(ownerName);
timerInfoDictionary[ownerName] = info;
}
}
}
private void LoadHierarchyTimerInfo(string ownerName)
{
sb.Clear();
sb.Append(ownerName).Append("TimerData");
if (ES3.KeyExists(sb.ToString(), "TimerData.json"))
{
HierarchyTimerInfo info = new HierarchyTimerInfo(ownerName);
info = ES3.Load<HierarchyTimerInfo>(sb.ToString(), "TimerData.json");
info.ResetEvent();
if (timerInfoDictionary.ContainsKey(ownerName) == false)
{
timerInfoDictionary.Add(ownerName, info);
}
else
{
timerInfoDictionary.Remove(ownerName);
timerInfoDictionary[ownerName] = info;
}
}
}
private void DelTimerInfo(string ownerName)
{
sb.Clear();
sb.Append(ownerName).Append("TimerData");
if (ES3.KeyExists(sb.ToString(), "TimerData.json"))
{
ES3.DeleteKey(sb.ToString(), "TimerData.json");
}
}
public void ActivateLoadSimpleTimer(string ownerName, int limiteTimerCount, UnityAction<int> OnStartTimer, UnityAction<int> OnPauseTimer, UnityAction<int> OnStopTimer, UnityAction<int> OnPassedTime)
{
int timerCount = limiteTimerCount;
LoadSimpleTimerInfo(ownerName);
if (timerInfoDictionary.ContainsKey(ownerName) == true)
{
if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
timerCount = limiteTimerCount - totalPassedTimeSecond;
}
}
// <20><><EFBFBD><EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (IsStartedTimer() == false)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ÿ<≯Ӱ<CCB8> <20><><EFBFBD>ٸ<EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
StartTimer();
}
SimpleTimerInfo info = timerInfoDictionary[ownerName] as SimpleTimerInfo;
if (info != null)
{
info.time = timerCount;
info.limiteTimerCount = limiteTimerCount;
if (info.OnStartTimer == null)
{
info.OnStartTimer += OnStartTimer;
}
if (info.OnPauseTimer == null)
{
info.OnPauseTimer += OnPauseTimer;
}
if (info.OnStopTimer == null)
{
info.OnStopTimer += OnStopTimer;
}
if (info.OnPassedTime == null)
{
info.OnPassedTime += OnPassedTime;
}
info.OnStartTimer?.Invoke(timerCount);
}
SaveSimpleTimerInfo();
}
}
public void ActivateSimpleTimer(string ownerName, int limiteTimerCount, UnityAction<int> OnStartTimer, UnityAction<int> OnPauseTimer, UnityAction<int> OnStopTimer, UnityAction<int> OnPassedTime)
{
int timerCount = limiteTimerCount;
LoadSimpleTimerInfo(ownerName);
if (timerInfoDictionary.ContainsKey(ownerName) == true)
{
if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
timerCount = limiteTimerCount - totalPassedTimeSecond;
}
}
}
else
{
timerInfoDictionary.Add(ownerName, new SimpleTimerInfo(ownerName, timerCount, DateTime.Now, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime));
}
// <20><><EFBFBD><EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (IsStartedTimer() == false)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ÿ<≯Ӱ<CCB8> <20><><EFBFBD>ٸ<EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
StartTimer();
}
SimpleTimerInfo info = timerInfoDictionary[ownerName] as SimpleTimerInfo;
if (info != null)
{
info.time = timerCount;
info.limiteTimerCount = limiteTimerCount;
if (info.OnStartTimer == null)
{
info.OnStartTimer += OnStartTimer;
}
if (info.OnPauseTimer == null)
{
info.OnPauseTimer += OnPauseTimer;
}
if (info.OnStopTimer == null)
{
info.OnStopTimer += OnStopTimer;
}
if (info.OnPassedTime == null)
{
info.OnPassedTime += OnPassedTime;
}
info.OnStartTimer?.Invoke(timerCount);
}
SaveSimpleTimerInfo();
}
public void ActivateHierarchyTimer(string ownerName, int limiteTimerCount, int limiteHierarchyCount, UnityAction<int, int> OnStartTimer, UnityAction<int, int> OnPauseTimer, UnityAction<int> OnStopTimer, UnityAction<int> OnPassedTime)
{
int timerCount = limiteTimerCount;
int hierarchyCount = 0;
LoadHierarchyTimerInfo(ownerName);
if (timerInfoDictionary.ContainsKey(ownerName) == true)
{
// <20>ε<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯Ӱ<CCB8> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>
// Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
hierarchyCount = totalPassedTimeSecond / limiteTimerCount;
timerCount = totalPassedTimeSecond - (hierarchyCount * limiteTimerCount);
timerCount = limiteTimerCount - timerCount;
//timerCount = limiteTimerCount - (totalPassedTimeSecond % limiteTimerCount);
}
}
// <20>ε<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯Ӱ<CCB8> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
}
else
{
// <20>ε<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯Ӱ<CCB8> <20><><EFBFBD><EFBFBD> <20><>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
timerInfoDictionary.Add(ownerName, new HierarchyTimerInfo(ownerName, timerCount, DateTime.Now, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime));
}
// <20><><EFBFBD><EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (IsStartedTimer() == false)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ÿ<≯Ӱ<CCB8> <20><><EFBFBD>ٸ<EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
StartTimer();
}
HierarchyTimerInfo info = timerInfoDictionary[ownerName] as HierarchyTimerInfo;
if (info != null)
{
info.time = timerCount;
info.limiteTimerCount = limiteTimerCount;
info.limiteHierarchyCount = limiteHierarchyCount;
if (info.OnStartTimer == null)
{
info.OnStartTimer += OnStartTimer;
}
if (info.OnPauseTimer == null)
{
info.OnPauseTimer += OnPauseTimer;
}
if (info.OnStopTimer == null)
{
info.OnStopTimer += OnStopTimer;
}
if (info.OnPassedTime == null)
{
info.OnPassedTime += OnPassedTime;
}
info.OnStartTimer?.Invoke(timerCount, hierarchyCount);
}
SaveHierarchyTimerInfo();
}
public void DeactivateTimer(string ownerName)
{
timerInfoDictionary.Remove(ownerName);
DelTimerInfo(ownerName);
if (timerInfoDictionary.Count <= 0)
{
EndTiemr();
}
}
public void PauseTimer(string ownerName)
{
SaveSimpleTimerInfo();
SaveHierarchyTimerInfo();
SaveTime();
/*timerInfoDictionary.Remove(ownerName);
if (timerInfoDictionary.Count <= 0)
{
EndTiemr();
}*/
}
public bool IsVaildTimer(string ownerName)
{
return timerInfoDictionary.ContainsKey(ownerName);
}
public bool IsVaildSimpleTimer(string ownerName)
{
// LoadSimpleTimerInfo(ownerName);
return timerInfoDictionary.ContainsKey(ownerName);
}
public void SetWaitForSeconds(float time)
{
waitForSeconds = new WaitForSecondsRealtime(1.0f);
}
private bool IsStartedTimer()
{
return timerCoroutine != null;
}
private void StartTimer()
{
waitForSeconds = new WaitForSecondsRealtime(1.0f);
timerCoroutine = StartCoroutine(Timer());
}
private void EndTiemr()
{
if (IsStartedTimer() == true)
{
StopCoroutine(timerCoroutine);
timerCoroutine = null;
}
}
IEnumerator Timer()
{
SimpleTimerInfo simpleTimerInfo = null;
HierarchyTimerInfo hierarchyTimerInfo = null;
while (true)
{
yield return waitForSeconds;
foreach (KeyValuePair<string, TimerInfo> keyValue in timerInfoDictionary)
{
simpleTimerInfo = timerInfoDictionary[keyValue.Key] as SimpleTimerInfo;
if (simpleTimerInfo != null)
{
if (simpleTimerInfo.time <= 0)
{
simpleTimerInfo.time = simpleTimerInfo.limiteTimerCount;
}
else
{
simpleTimerInfo.time -= 1;
}
simpleTimerInfo.OnPassedTime?.Invoke(simpleTimerInfo.time);
if (simpleTimerInfo.time <= 0)
{
simpleTimerInfo.OnStopTimer?.Invoke(0);
break;
}
}
else
{
hierarchyTimerInfo = timerInfoDictionary[keyValue.Key] as HierarchyTimerInfo;
if (hierarchyTimerInfo != null)
{
if (hierarchyTimerInfo.time <= 0)
{
hierarchyTimerInfo.time = hierarchyTimerInfo.limiteTimerCount;
}
else
{
hierarchyTimerInfo.time -= 1;
}
hierarchyTimerInfo.OnPassedTime?.Invoke(hierarchyTimerInfo.time);
if (hierarchyTimerInfo.time <= 0)
{
hierarchyTimerInfo.OnStopTimer?.Invoke(0);
break;
}
}
}
}
}
}
public void SaveTime()
{
sb.Clear();
sb.Append(Application.persistentDataPath).Append("/Time.json");
string fileName = Path.Combine(sb.ToString());
if (File.Exists(fileName))
{
File.Delete(fileName);
}
string jsonFile = JsonConvert.SerializeObject(DateTime.Now);
File.WriteAllText(fileName, jsonFile);
}
public DateTime LoadTime()
{
sb.Clear();
sb.Append(Application.persistentDataPath).Append("/Time.json");
string fileName = Path.Combine(sb.ToString());
if (File.Exists(fileName) == false)
{
SaveTime();
loadTime = DateTime.Now;
return loadTime;
}
string jsonFile = File.ReadAllText(fileName);
loadTime = JsonConvert.DeserializeObject<DateTime>(jsonFile);
return loadTime;
}
private void OnApplicationQuit()
{
SaveSimpleTimerInfo();
SaveHierarchyTimerInfo();
SaveTime();
}
#if UNITY_EDITOR
private void OnApplicationFocus(bool focusStatus)
{
if (timerInfoDictionary.Count > 0)
{
if (focusStatus)
{
SimpleTimerInfo simpleTimerInfo = null;
HierarchyTimerInfo hierarchyTimerInfo = null;
if (IsStartedTimer() == false)
{
StartTimer();
}
foreach (KeyValuePair<string, TimerInfo> dic in timerInfoDictionary)
{
simpleTimerInfo = dic.Value as SimpleTimerInfo;
if (simpleTimerInfo != null)
{
if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - simpleTimerInfo.saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (simpleTimerInfo.limiteTimerCount - simpleTimerInfo.time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
simpleTimerInfo.time = simpleTimerInfo.limiteTimerCount - totalPassedTimeSecond;
}
simpleTimerInfo.OnPauseTimer(simpleTimerInfo.time);
}
}
else
{
hierarchyTimerInfo = dic.Value as HierarchyTimerInfo;
if (hierarchyTimerInfo != null)
{
int hierarchyCount = 0;
if (hierarchyTimerInfo.saveTimeData != null && hierarchyTimerInfo.saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - hierarchyTimerInfo.saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
hierarchyCount = totalPassedTimeSecond / hierarchyTimerInfo.limiteTimerCount;
hierarchyTimerInfo.time = totalPassedTimeSecond - (hierarchyCount * hierarchyTimerInfo.limiteTimerCount);
hierarchyTimerInfo.time = hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time;
//hierarchyTimerInfo.time = hierarchyTimerInfo.limiteTimerCount - (totalPassedTimeSecond % hierarchyTimerInfo.limiteTimerCount);
}
hierarchyTimerInfo.OnPauseTimer(hierarchyTimerInfo.time, hierarchyCount);
}
}
}
}
}
else
{
SaveSimpleTimerInfo();
SaveHierarchyTimerInfo();
SaveTime();
EndTiemr();
}
}
}
#else
private void OnApplicationPause(bool pauseStatus)
{
if (timerInfoDictionary.Count > 0)
{
if (!pauseStatus)
{
SimpleTimerInfo simpleTimerInfo = null;
HierarchyTimerInfo hierarchyTimerInfo = null;
if (IsStartedTimer() == false)
{
StartTimer();
}
foreach (KeyValuePair<string, TimerInfo> dic in timerInfoDictionary)
{
simpleTimerInfo = dic.Value as SimpleTimerInfo;
if (simpleTimerInfo != null)
{
if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - simpleTimerInfo.saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (simpleTimerInfo.limiteTimerCount - simpleTimerInfo.time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
simpleTimerInfo.time = simpleTimerInfo.limiteTimerCount - totalPassedTimeSecond;
}
simpleTimerInfo.OnPauseTimer(simpleTimerInfo.time);
}
}
else
{
hierarchyTimerInfo = dic.Value as HierarchyTimerInfo;
if (hierarchyTimerInfo != null)
{
int hierarchyCount = 0;
if (hierarchyTimerInfo.saveTimeData != null && hierarchyTimerInfo.saveTimeData.Year != 1)
{
double passedTimeSecond = (DateTime.Now - hierarchyTimerInfo.saveTimeData).TotalSeconds;
int totalPassedTimeSecond = (hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time) + (Int32)passedTimeSecond;
if (totalPassedTimeSecond >= 0)
{
hierarchyCount = totalPassedTimeSecond / hierarchyTimerInfo.limiteTimerCount;
hierarchyTimerInfo.time = totalPassedTimeSecond - (hierarchyCount * hierarchyTimerInfo.limiteTimerCount);
hierarchyTimerInfo.time = hierarchyTimerInfo.limiteTimerCount - hierarchyTimerInfo.time;
//hierarchyTimerInfo.time = hierarchyTimerInfo.limiteTimerCount - (totalPassedTimeSecond % hierarchyTimerInfo.limiteTimerCount);
}
hierarchyTimerInfo.OnPauseTimer(hierarchyTimerInfo.time, hierarchyCount);
}
}
}
}
}
else
{
SaveSimpleTimerInfo();
SaveHierarchyTimerInfo();
SaveTime();
EndTiemr();
}
}
}
#endif
}