using System; using System.Collections.Generic; using UnityEngine; public class TimeMgr : SingletonMonobehaviour { private Dictionary timeItems = new Dictionary(); private List timeItemList = new List(); private int hourBuff = -1; private int minuteBuff = -1; public int dayBuff = -1; public int monthBuff { get { return LocalSave.GetInt("month"); } private set { LocalSave.SetInt("month", value); } } public int weekBuff { get { return LocalSave.GetInt("week"); } private set { LocalSave.SetInt("week", value); } } public event Action OnDayEvent; public event Action OnHourEvent; public event Action OnMinuteEvent; public event Action OnMonthAfterPlayerDataInitializeEvent; public event Action OnWeekAfterPlayerDataInitializeEvent; private void LateUpdate() { try { // TODO YYL // if (weekBuff != GetWeekOfYear(TimeUtility.ServerNow)) // { // if (OnWeekAfterPlayerDataInitializeEvent != null && DTC0102_tagCDBPlayer.isAfterPlayerDataInitialize) // { // OnWeekAfterPlayerDataInitializeEvent(); // weekBuff = GetWeekOfYear(TimeUtility.ServerNow); // } // } // if (monthBuff != TimeUtility.ServerNow.Month) // { // if (OnMonthAfterPlayerDataInitializeEvent != null && DTC0102_tagCDBPlayer.isAfterPlayerDataInitialize) // { // OnMonthAfterPlayerDataInitializeEvent(); // monthBuff = TimeUtility.ServerNow.Month; // } // } if (dayBuff != TimeUtility.ServerNow.Day) { if (OnDayEvent != null) { OnDayEvent(); } dayBuff = TimeUtility.ServerNow.Day; } if (hourBuff != TimeUtility.ServerNow.Hour) { if (OnHourEvent != null) { OnHourEvent(); } hourBuff = TimeUtility.ServerNow.Hour; } if (minuteBuff != TimeUtility.ServerNow.Minute) { if (OnMinuteEvent != null) { OnMinuteEvent(); } minuteBuff = TimeUtility.ServerNow.Minute; } } catch (Exception e) { Debug.Log(e.StackTrace); } for (int i = 0; i < syntonyList.Count; i++) { if ((TimeUtility.ServerNow - syntonyList[i].endTime).TotalSeconds > 0) { if (syntonyList[i].callback != null) { syntonyList[i].callback(); } var _type = syntonyList[i].type; syntonyList.RemoveAt(i); if (OnSyntonyEvent != null) { OnSyntonyEvent(_type); } i--; } } if (timeItems.Count > 0) { timeItemList.RemoveRange(0, timeItemList.Count); foreach (Component item in timeItems.Keys) { if (item == null) continue; timeItemList.Add(timeItems[item]); } for (int i = 0; i < timeItemList.Count; i++) { timeItemList[i].Update(); } } } //获取当前datatime是今年的第几周 int GetWeekOfYear(DateTime date) { // 获取该年第一天 DateTime firstDayOfYear = new DateTime(date.Year, 1, 1); // 计算第一周的开始日期(如果1月1日不是周一,则向前推到最近的周一) int daysOffset = DayOfWeek.Thursday - firstDayOfYear.DayOfWeek; // 如果是周五、周六、周日,我们需要向后推 if (daysOffset < 0) daysOffset += 7; // 计算该年第一个周四的日期 DateTime firstThursday = firstDayOfYear.AddDays(daysOffset); // 计算给定日期与第一个周四之间的天数差 int daysSinceFirstThursday = (date - firstThursday).Days; // 计算周数 int weekNumber = (daysSinceFirstThursday / 7) + 1; // 处理年初和年末的特殊情况 if (weekNumber < 1) { // 如果周数小于1,说明是上一年的最后一周 return GetWeekOfYear(new DateTime(date.Year - 1, 12, 31)); } else if (weekNumber > 52) { // 计算下一年的第一个周四 DateTime nextYearFirstDay = new DateTime(date.Year + 1, 1, 1); int nextYearDaysOffset = DayOfWeek.Thursday - nextYearFirstDay.DayOfWeek; if (nextYearDaysOffset < 0) nextYearDaysOffset += 7; DateTime nextYearFirstThursday = nextYearFirstDay.AddDays(nextYearDaysOffset); // 如果给定日期在下一年的第一个周四之前,那么它属于本年的最后一周 if (date < nextYearFirstThursday) { return weekNumber; } else { // 否则,这是下一年的第一周 return 1; } } return weekNumber; } public void Register(Component comp, Action func, float t, int loopCnt = 1) { if (comp == null) return; if (!timeItems.ContainsKey(comp)) { TimeItem item = new TimeItem(t, comp, loopCnt, func); timeItems.Add(comp, item); } } public void SetInterval(Component comp, float t) { if (timeItems.ContainsKey(comp)) { TimeItem item = timeItems[comp]; item.time = t; } } public void UnRegister(Component comp) { if (comp == null) return; if (timeItems.ContainsKey(comp)) { TimeItem item = timeItems[comp]; timeItems.Remove(comp); item = null; } } public bool IsRegister(Component comp) { return timeItems.ContainsKey(comp); } public void Register(SyntonyType type, float _totalTime, Action _func = null) { int index; if (ContainsSyntony(type, out index)) { syntonyList[index].SetTime(_totalTime, _func); } else { Syntony syntony = new Syntony(); syntony.type = type; syntony.SetTime(_totalTime, _func); syntonyList.Add(syntony); } } public void UnRegister(SyntonyType type) { int index; if (ContainsSyntony(type, out index)) { syntonyList.RemoveAt(index); } } public struct Syntony { public SyntonyType type; public DateTime endTime { get; private set; } public Action callback; public void SetTime(float _totalTime, Action _func = null) { endTime = TimeUtility.ServerNow.AddSeconds(_totalTime); callback = _func; Debug.LogFormat("{0}{1}", type, endTime); } } private List syntonyList = new List(); public event Action OnSyntonyEvent; private bool ContainsSyntony(SyntonyType type, out int index) { index = 0; for (int i = 0; i < syntonyList.Count; i++) { if (syntonyList[i].type == type) { index = i; return true; } } return false; } public enum SyntonyType { PrayerRedpoint, BossShow, BossShowName, BossShowDialogue, BossShowSound, FairyLeaugeStage, VipExperirnceOverdue, HeavenBattleState, Realm, RealmSit, GuardHurtEffect, GetFairyInfo, Audio, OSRedEnvelope, AutoPlayVoice, } }