using System;
using System.Collections.Generic;
using UnityEngine;
///Singleton是单例父类,请自行实现
public class EventSys : Singleton<EventSys>
{
public delegate T event_handler<T>();
public delegate T event_handler<T, K>(K num);
public delegate T event_handler<T, K, V>(K value, V value2);
public delegate T event_handler<T, K, V, L>(K value, V value2, L value3);
public Dictionary<string, Delegate> dic = new Dictionary<string, Delegate>();
public void add_listener<T>(string event_name, event_handler<T> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler<T>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener<T>(string event_name, event_handler<T> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler<T>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event<T>(string name)
{
if (dic.ContainsKey(name))
{
event_handler<T> handler = (event_handler<T>)dic[name];
if (handler == null)
{
dic.Remove(name);
Debug.LogError("移除无效事件:" + name);
return default(T);
}
return handler();
}
Debug.LogWarning("事件系统没有:" + name);
return default(T);
}
public void add_listener<T, K>(string event_name, event_handler<T, K> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler<T, K>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener<T, K>(string event_name, event_handler<T, K> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler<T, K>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event<T, K>(string name, K value)
{
if (dic.ContainsKey(name))
{
event_handler<T, K> handler = (event_handler<T, K>)dic[name];
if (handler == null)
{
remove_listener(name, handler);
Debug.LogError("移除无效事件:" + name);
return default(T);
}
return handler(value);
}
Debug.LogWarning("事件系统没有:" + name);
return default(T);
}
public void add_listener<T, K, V>(string event_name, event_handler<T, K, V> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler<T, K, V>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener<T, K, V>(string event_name, event_handler<T, K, V> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler<T, K, V>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event<T, K, V>(string name, K value, V value2)
{
if (dic.ContainsKey(name))
{
event_handler<T, K, V> handler = (event_handler<T, K, V>)dic[name];
if (handler == null)
{
remove_listener(name, handler);
Debug.LogError("移除无效事件:" + name);
return default(T);
}
return handler(value, value2);
}
Debug.LogWarning("事件系统没有:" + name);
return default(T);
}
public void add_listener<T, K, V, L>(string event_name, event_handler<T, K, V, L> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler<T, K, V, L>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener<T, K, V, L>(string event_name, event_handler<T, K, V, L> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler<T, K, V, L>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event<T, K, V, L>(string name, K value, V value2, L valu3)
{
if (dic.ContainsKey(name))
{
event_handler<T, K, V, L> handler = (event_handler<T, K, V, L>)dic[name];
if (handler == null)
{
remove_listener(name, handler);
Debug.LogError("移除无效事件:" + name);
return default(T);
}
return handler(value, value2, valu3);
}
Debug.LogWarning("事件系统没有:" + name);
return default(T);
}
}
using System.Collections;
using UnityEngine;
using static EventSys;
namespace Game.Timer
{
/// <summary>
/// 想直接终止计时器可以让调用的事件返回值为flase或者直接调用EventSys.Ins.remove_listener("调用Timer方法时的返回值")
/// </summary>
///UnitySingleton是单例父类,请自行实现
public class Timers : UnitySingleton<Timers>
{
long idCount;
EventSys eventSys;
public override void Awake()
{
base.Awake();
eventSys = EventSys.Ins;
}
/// <summary>
/// 用协程每隔一段时间就会调用一次方法,如果方法返回值为null则结束协程
/// </summary>
/// <param name="event_handler">方法</param>
/// <param name="seconds">隔几秒调用一次(不会一传进来就立即调用)</param>
/// <param name="count">调用次数</param>
/// <param name="obj">如果这个游戏物体不存在或者被关闭了,则自动终止协程运行,为null则不会自动判断</param>
public string Timer(event_handler<bool> event_handler, float seconds, int count, GameObject obj)
{
idCount++;
string name = "Timer_" + idCount;
eventSys.add_listener(name, event_handler);
if (!obj)
{
StartCoroutine(ClockTimer(event_handler, seconds, count));
}
else
{
StartCoroutine(ClockTimer(event_handler, seconds, count, obj));
}
return name;
}
/// <summary>
/// 用协程每隔一段时间就会调用一次方法,如果方法返回值为null则结束协程
/// </summary>
/// <param name="event_handler">方法</param>
/// <param name="seconds">隔几秒调用一次(不会一传进来就立即调用)</param>
/// <param name="count">调用次数</param>
/// <param name="obj">如果这个游戏物体不存在或者被关闭了,则自动终止协程运行,为null则不会自动判断</param>
/// <param name="returValue">事件的返回值</param>
public string Timer<K>(event_handler<bool, K> event_handler, float seconds, int count, GameObject obj, K returValue)
{
idCount++;
string name = "Timer_" + idCount;
eventSys.add_listener(name, event_handler);
if (!obj)
{
StartCoroutine(ClockTimer(event_handler, seconds, count, returValue));
}
else
{
StartCoroutine(ClockTimer(event_handler, seconds, count, obj, returValue));
}
return name;
}
/// <summary>
/// 进行计时读秒,到达一定时间后调用事件
/// </summary>
IEnumerator ClockTimer(event_handler<bool> event_handler, float seconds, int count)
{
string name = "Timer_" + idCount;
WaitForSeconds spawnWait = new WaitForSeconds(seconds);
while (count > 0)
{
yield return spawnWait;
if (eventSys.dispatch_event<bool>(name) == false)
{
break;
}
count--;
}
eventSys.remove_listener(name, event_handler);
}
/// <summary>
/// 进行计时读秒,到达一定时间后调用事件
/// </summary>
IEnumerator ClockTimer(event_handler<bool> event_handler, float seconds, int count, GameObject obj)
{
string name = "Timer_" + idCount;
WaitForSeconds spawnWait = new WaitForSeconds(seconds);
while (count > 0)
{
yield return spawnWait;
if (!obj || !obj.activeSelf)
{
break;
}
if (eventSys.dispatch_event<bool>(name) == false)
{
break;
}
count--;
}
eventSys.remove_listener(name, event_handler);
}
/// <summary>
/// 进行计时读秒,到达一定时间后调用事件,带一个返回值的
/// </summary>
IEnumerator ClockTimer<K>(event_handler<bool, K> event_handler, float seconds, int count, GameObject obj, K returValue)
{
string name = "Timer_" + idCount;
WaitForSeconds spawnWait = new WaitForSeconds(seconds);
while (count > 0)
{
yield return spawnWait;
if (!obj || !obj.activeSelf)
{
break;
}
if (!eventSys.dispatch_event<bool, K>(name, returValue))
{
break;
}
count--;
}
eventSys.remove_listener(name, event_handler);
}
/// <summary>
/// 进行计时读秒,到达一定时间后调用事件,带一个返回值的
/// </summary>
IEnumerator ClockTimer<K>(event_handler<bool, K> event_handler, float seconds, int count, K returValue)
{
string name = "Timer_" + idCount;
WaitForSeconds spawnWait = new WaitForSeconds(seconds);
while (count > 0)
{
yield return spawnWait;
if (eventSys.dispatch_event<bool, K>(name, returValue) == false)
{
break;
}
count--;
}
eventSys.remove_listener(name, event_handler);
}
}
}
using System;
namespace Systems.DateTimeSystem
{
///Singleton是单例父类,请自行实现
public class DateTimeSystem : Singleton<DateTimeSystem>
{
DateTime timeDifference = new DateTime(2022, 1, 1, 0, 0, 0);//时间差值,随便多少都行,不重要
/// <summary>
/// 从timeDifference差值到当前日期的秒数
/// </summary>
public int DifferenceSecond
{
get { return (int)GetDateTimeDifference(GetCurrentDateTime(), timeDifference); }
}
/// <summary>
/// 获取当前日期时间
/// </summary>
public DateTime GetCurrentDateTime()
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
return TimeZoneInfo.ConvertTime(DateTime.Now, cstZone);
}
/// <summary>
/// 获取当前日期时间,年月日
/// </summary>
public string GetCurrentDateTimeDay()
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
DateTime targetTime = TimeZoneInfo.ConvertTime(DateTime.Now, cstZone);
return targetTime.ToString("yyyy-MM-dd");
}
/// <summary>
/// 获取俩段时间的差值
/// </summary>
/// <param name="dateTime1">离现在日期比较近的时间</param>
/// <param name="dateTime2">离现在日期比较远的时间</param>
public long GetDateTimeDifference(DateTime dateTime1, DateTime dateTime2)
{
return Convert.ToInt64((dateTime1 - dateTime2).TotalSeconds);
}
/// <summary>
/// 将秒数转为DateTime
/// </summary>
/// <param name="seconds"></param>
/// <returns></returns>
public DateTime SecondsToDateTime(long seconds)
{
return timeDifference.AddSeconds(seconds);
}
/// <summary>
/// 根据一段日期获取那段日期到现在的时间
/// </summary>
/// <param name="dateTime">一个时间日期</param>
/// <returns></returns>
public string DateTimeFormat(DateTime dateTime)
{
return ConvertDate(GetDateTimeDifference(GetCurrentDateTime(), dateTime));
}
/// <summary>
/// 将秒数转换为一段确切的时间,比如离线时间,登录时间
/// 3小时之后的好像有点毛病,不过目前还没用上这个方法,所以暂时没管
/// </summary>
/// <param name="time">秒数</param>
/// <returns></returns>
public string ConvertDate(long time)
{
if (time < 1)
{
return "";
}
string str = "", str1 = "", str2 = "", str3 = "", str4 = "", str5 = "", str6 = "";
DateTime dateTime = SecondsToDateTime(time);
int years = dateTime.Year;
int months = dateTime.Month;
int days = dateTime.Day;
int hours = dateTime.Hour;
int minutes = dateTime.Minute;
int seconds = dateTime.Second;
if (time > 86400)
{
str3 = days + "D";
if (time > 2592000 || days <= 3 && time > 1800000)
{
str2 = months + "M-";
if (time > 31536000)
{
str1 = years + "Y-";
}
else
{
str3 += "-";
}
}
}
if (time < 31536000)
{
str4 = hours + "H";
if (time < 2592000)
{
str4 += "-";
str5 = minutes + "M";
if (time < 86400)
{
str5 += "-";
str6 = seconds + "S";
}
}
}
str = str1 + str2 + str3 + str4 + str5 + str6;
return str;
}
/// <summary>
/// 将秒数转换为一段带有'的日期,最大到小时,比如22'05
/// </summary>
/// <param name="time">秒数</param>
/// <returns></returns>
public string ConvertShortDate(int time)
{
if (time < 1)
{
return "0S";
}
string str = "", str4 = "", str5 = "", str6 = "";
DateTime dateTime = SecondsToDateTime(time);
int hours = dateTime.Hour;
int minutes = dateTime.Minute;
int seconds = dateTime.Second;
if (hours >= 1)
{
if (hours < 10)
{
str4 = "0" + hours + "'";
}
else
{
str4 = hours + "'";
}
}
if (minutes < 10)
{
str5 = "0" + minutes;
}
else
{
str5 = "" + minutes;
}
if (seconds < 10)
{
str6 = "'0" + seconds;
}
else
{
str6 = "'" + seconds;
}
str = str4 + str5 + str6;
return str;
}
/// <summary>
/// 查询今天星期几
/// </summary>
/// <returns></returns>
public int QueryWeek()
{
return (int)GetCurrentDateTime().DayOfWeek + 1;
}
}
}