using System;
using System.Collections.Generic;
///Singleton是单例接口,请自行实现
public class EventSys : Singleton<EventSys>
{
public delegate T event_handler<T>();
public delegate T event_handler2<T,K>(K num);
public delegate T event_handler3<T,K>(T value,K value2);
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))
{
return ((event_handler<T>)dic[name])();
}
return default(T);
}
public void add_listener2<T, K>(string event_name, event_handler2<T, K> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler2<T, K>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener2<T, K>(string event_name, event_handler2<T, K> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler2<T, K>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event2<T, K>(string name, K value)
{
if (dic.ContainsKey(name))
{
return ((event_handler2<T, K>)dic[name])(value);
}
return default(T);
}
public void add_listener3<T, K>(string event_name, event_handler3<T, K> h)
{
if (dic.ContainsKey(event_name))
{
dic[event_name] = (event_handler3<T, K>)dic[event_name] + h;
}
else
{
dic.Add(event_name, h);
}
}
public void remove_listener3<T, K>(string event_name, event_handler3<T, K> h)
{
if (!dic.ContainsKey(event_name))
{
return;
}
dic[event_name] = (event_handler3<T, K>)dic[event_name] - h;
if (dic[event_name] == null)
{
dic.Remove(event_name);
}
}
public T dispatch_event3<T,K>(string name, T value, K value2)
{
if (dic.ContainsKey(name))
{
return ((event_handler3<T,K>)dic[name])(value,value2);
}
return value;
}
}
using System;
using System.Collections;
using UnityEngine;
using static EventSys;
namespace Game.Timer
{
//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)
{
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));
}
idCount++;
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_handler2<bool,K> event_handler, float seconds, int count, GameObject obj, K returValue)
{
string name = "Timer_" + idCount;
eventSys.add_listener2(name, event_handler);
if (!obj)
{
StartCoroutine(ClockTimer(event_handler, seconds, count, returValue));
}
else
{
StartCoroutine(ClockTimer(event_handler, seconds, count, obj, returValue));
}
idCount++;
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_handler2<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_event2<bool,object>(name, returValue) == false)
{
break;
}
count--;
}
eventSys.remove_listener2(name, event_handler);
}
/// <summary>
/// 进行计时读秒,到达一定时间后调用事件,带一个返回值的
/// </summary>
IEnumerator ClockTimer<K>(event_handler2<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_event2<bool, K>(name, returValue) == false)
{
break;
}
count--;
}
eventSys.remove_listener2(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>
/// 根据差值计算出来当前日期秒数
/// </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>
/// 将秒数转换为一段确切的时间,比如离线时间,登录时间
/// </summary>
/// <param name="time">秒数</param>
/// <returns></returns>
public string ConvertDate(long time)
{
if (time < 1)
{
return "0S";
}
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 > 31536000)
{
str1 = years + "Y";
}
if (time > 2592000 || days <= 3 && time > 1800000)
{
str2 = months + "M";
}
if (time > 86400)
{
str3 = days + "D";
}
if (time < 31536000)
{
str4 = hours + "H";
}
if (time < 2592000)
{
str5 = minutes + "M";
}
if (time < 86400)
{
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;
}
}
}