unity 事件系统+时间计时器+时间日期系统

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;
        }
    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值