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 onChangeActionTimerCount; public UnityEvent 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 = InternetTime.Ins.Time; public UnityAction 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 OnStartTimer; public UnityAction OnPauseTimer; public UnityAction OnStopTimer; public SimpleTimerInfo() { } public SimpleTimerInfo(string ownerName) { timerType = TimerType.Simple; this.ownerName = ownerName; } public SimpleTimerInfo(string ownerName, int time, DateTime timeData, UnityAction OnStartTimer, UnityAction OnPauseTimer, UnityAction OnStopTimer, UnityAction 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 OnStartTimer; public UnityAction OnPauseTimer; public UnityAction OnStopTimer; public HierarchyTimerInfo() { } public HierarchyTimerInfo(string ownerName) { timerType = TimerType.Hierarchy; this.ownerName = ownerName; } public HierarchyTimerInfo(string ownerName, int time, DateTime timeData, UnityAction OnStartTimer, UnityAction OnPauseTimer, UnityAction OnStopTimer, UnityAction 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 timerInfoDictionary = new Dictionary(); private Coroutine timerCoroutine = null; private WaitForSecondsRealtime waitForSeconds = null; private void Awake() { LoadAllTimerInfo(); } private void SaveSimpleTimerInfo() { foreach (KeyValuePair dic in timerInfoDictionary) { sb.Clear(); sb.Append(dic.Key).Append("TimerData"); SimpleTimerInfo info = timerInfoDictionary[dic.Key] as SimpleTimerInfo; if (info != null) { info.saveTimeData = InternetTime.Ins.Time; ES3.Save(sb.ToString(), info, "TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, // AES 또는 XOR 사용 가능 encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); } } } private void SaveHierarchyTimerInfo() { foreach (KeyValuePair dic in timerInfoDictionary) { sb.Clear(); sb.Append(dic.Key).Append("TimerData"); HierarchyTimerInfo info = timerInfoDictionary[dic.Key] as HierarchyTimerInfo; if (info != null) { info.saveTimeData = InternetTime.Ins.Time; ES3.Save(sb.ToString(), info, "TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, // AES 또는 XOR 사용 가능 encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); } } } private void LoadAllTimerInfo() { if (ES3.KeyExists("TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, encryptionPassword = "MyStrongPassword123" // 원하는 암호 })) { TimerInfo info = new TimerInfo(); info = ES3.Load("TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, // AES 또는 XOR 사용 가능 encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); 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(sb.ToString(), "TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, // AES 또는 XOR 사용 가능 encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); 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(sb.ToString(), "TimerData.json", new ES3Settings() { encryptionType = ES3.EncryptionType.AES, // AES 또는 XOR 사용 가능 encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); 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 OnStartTimer, UnityAction OnPauseTimer, UnityAction OnStopTimer, UnityAction OnPassedTime) { int timerCount = limiteTimerCount; LoadSimpleTimerInfo(ownerName); if (timerInfoDictionary.ContainsKey(ownerName) == true) { if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { double passedTimeSecond = (InternetTime.Ins.Time - timerInfoDictionary[ownerName].saveTimeData).TotalSeconds; int totalPassedTimeSecond = (limiteTimerCount - timerInfoDictionary[ownerName].time) + (Int32)passedTimeSecond; if (totalPassedTimeSecond >= 0) { timerCount = limiteTimerCount - totalPassedTimeSecond; } } // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. 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 OnStartTimer, UnityAction OnPauseTimer, UnityAction OnStopTimer, UnityAction OnPassedTime) { int timerCount = limiteTimerCount; LoadSimpleTimerInfo(ownerName); if (timerInfoDictionary.ContainsKey(ownerName) == true) { if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { double passedTimeSecond = (InternetTime.Ins.Time - 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, InternetTime.Ins.Time, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); } // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. 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 OnStartTimer, UnityAction OnPauseTimer, UnityAction OnStopTimer, UnityAction OnPassedTime) { int timerCount = limiteTimerCount; int hierarchyCount = 0; LoadHierarchyTimerInfo(ownerName); if (timerInfoDictionary.ContainsKey(ownerName) == true) { // 로드 한 정보가 있으면 작동 중인 타이머가 존재 하는 것 // 타이머 계산을 해야 한다. if (timerInfoDictionary[ownerName].saveTimeData != null && timerInfoDictionary[ownerName].saveTimeData.Year != 1) { double passedTimeSecond = (InternetTime.Ins.Time - 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); } } // 로드 된 정보에 따라 타이머가 바뀌어야 한다. } else { // 로드 한 정보가 없으면 작동 중인 타이머가 없는 것 // 새로 시작한 타이머의 정보를 등록해야 한다. timerInfoDictionary.Add(ownerName, new HierarchyTimerInfo(ownerName, timerCount, InternetTime.Ins.Time, OnStartTimer, OnPauseTimer, OnStopTimer, OnPassedTime)); } // 새로 타이머를 시작해야 한다. if (IsStartedTimer() == false) { // 기존에 시작하는 타이머가 없다면 타이머를 시작한다. 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 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; } } } } } } private const string TIME_KEY = "SavedTime"; public void SaveTime() { // 인터넷 시간을 저장 ES3.Save(TIME_KEY, InternetTime.Ins.Time, new ES3Settings() { encryptionType = ES3.EncryptionType.AES, encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); } public DateTime LoadTime() { if (!ES3.KeyExists(TIME_KEY, new ES3Settings() { encryptionType = ES3.EncryptionType.AES, encryptionPassword = "MyStrongPassword123" // 원하는 암호 })) { SaveTime(); loadTime = InternetTime.Ins.Time; return loadTime; } loadTime = ES3.Load(TIME_KEY, InternetTime.Ins.Time, new ES3Settings() { encryptionType = ES3.EncryptionType.AES, encryptionPassword = "MyStrongPassword123" // 원하는 암호 }); 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 dic in timerInfoDictionary) { simpleTimerInfo = dic.Value as SimpleTimerInfo; if (simpleTimerInfo != null) { if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1) { double passedTimeSecond = (InternetTime.Ins.Time - 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 = (InternetTime.Ins.Time - 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 dic in timerInfoDictionary) { simpleTimerInfo = dic.Value as SimpleTimerInfo; if (simpleTimerInfo != null) { if (simpleTimerInfo.saveTimeData != null && simpleTimerInfo.saveTimeData.Year != 1) { double passedTimeSecond = (InternetTime.Ins.Time - 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 = (InternetTime.Ins.Time - 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 }