12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- using System;
- namespace XGame.Framework.Time
- {
- public class Alarm : IAlarm, IDisposable
- {
- public enum AlarmRunState : sbyte
- {
- None,
- Running,
- Stoped,
- Finished,
- }
- private long _triggerTimeStamp;
- private long _curTimeStamp;
- private Action _action;
- private AlarmRunState _runState;
- public Alarm(Action action, long curTimeStamp, long triggerTimeStamp)
- {
- #if UNITY_EDITOR
- UnityEngine.Assertions.Assert.IsTrue(triggerTimeStamp > curTimeStamp, "设置闹钟触发时间不能小于或者等于当前时间");
- #endif
- _triggerTimeStamp = triggerTimeStamp;
- _curTimeStamp = curTimeStamp;
- _action = action;
- _runState = AlarmRunState.Running;
- }
- public void SetTime(long timestamp)
- {
- if (_runState == AlarmRunState.Running)
- {
- _curTimeStamp = timestamp;
- }
- }
- public void Cancel()
- {
- _runState = AlarmRunState.Stoped;
- _action = null;
- }
- public bool Update(int elapse)
- {
- if (_runState != AlarmRunState.Running)
- {
- return true;
- }
- _curTimeStamp += elapse;
- if (_curTimeStamp >= _triggerTimeStamp)
- {
- _runState = AlarmRunState.Finished;
- try
- {
- _action?.Invoke();
- }
- catch (Exception e)
- {
- Log.Exception("闹钟回调执行发生异常", e);
- //throw new Exception($"闹钟回调执行发生异常:{e}");
- }
- return true;
- }
- return false;
- }
- public void Dispose()
- {
- _action = null;
- }
- }
- }
|