diff --git a/Assets/00.StaryEvo/Runtime/Tool/Timer.meta b/Assets/00.StaryEvo/Runtime/Tool/Timer.meta
new file mode 100644
index 0000000..8bc57e2
--- /dev/null
+++ b/Assets/00.StaryEvo/Runtime/Tool/Timer.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cdd5f630d231efb48b075b3b7c318b34
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs
new file mode 100644
index 0000000..4221709
--- /dev/null
+++ b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs
@@ -0,0 +1,56 @@
+using System;
+using Stary.Evo;
+using UnityEngine;
+using UnityEngine.Serialization;
+
+namespace Stary.Evo
+{
+ public class TimerController : MonoBehaviour, IController
+ {
+ public string TimerName => gameObject.name;
+ private bool isStart = false;
+
+ ///
+ /// 持续时间
+ ///
+ private float timeDuration;
+
+
+ ///
+ /// 时间到达的事件
+ ///
+ private Action onArrivalTimeComplete;
+
+ ///
+ /// 持续时间最大阈值
+ ///
+ public float timeDurationMax;
+
+ public void StartTimer(float timeDurationMax, Action onArrivalTimeComplete)
+ {
+ this.timeDurationMax = timeDurationMax;
+ this.onArrivalTimeComplete = onArrivalTimeComplete;
+ timeDuration = 0;
+ isStart = true;
+ }
+
+ private void Update()
+ {
+ if (isStart)
+ {
+ timeDuration += Time.deltaTime;
+ if (timeDuration >= timeDurationMax)
+ {
+ onArrivalTimeComplete?.Invoke();
+ this.GetSystem().RemoveTimer(TimerName);
+ }
+ }
+ }
+
+ public IArchitecture GetArchitecture()
+ {
+ ITimerSystem system = this.GetSystem();
+ return system.GetArchitecture();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs.meta b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs.meta
new file mode 100644
index 0000000..58dff3e
--- /dev/null
+++ b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a0837a1376a9b5f4db88fe9e9601b981
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs
new file mode 100644
index 0000000..60d979f
--- /dev/null
+++ b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using Stary.Evo;
+using UnityEngine;
+
+namespace Stary.Evo
+{
+ public interface ITimerSystem : ISystem
+ {
+ void CreateTimer(string timerName, float timeDuration, Action onArrivalTimeComplete);
+ void RemoveTimer(string timerName);
+ }
+
+ public class TimerSystem : AbstractSystem, ITimerSystem
+ {
+ private static Dictionary
+ _timerControllers = new Dictionary();
+
+ private static GameObject timerSystem;
+
+ protected override void OnInit()
+ {
+ _timerControllers = new Dictionary();
+ timerSystem = new GameObject("Timer");
+ }
+
+ public void CreateTimer(string timerName, float timeDuration, Action onArrivalTimeComplete)
+ {
+ if (_timerControllers.ContainsKey(timerName))
+ {
+ Debug.LogError($"TimerSystem CreateTimer 重复创建定时器 {timerName}");
+ return;
+ }
+
+ var _timer = new GameObject(timerName);
+ _timer.transform.SetParent(timerSystem.transform);
+ var timerController = _timer.AddComponent();
+ _timerControllers.Add(timerName, timerController);
+ timerController.StartTimer(timeDuration, onArrivalTimeComplete);
+ }
+
+ public void RemoveTimer(string timerName)
+ {
+ if (_timerControllers.ContainsKey(timerName))
+ {
+ var timerController = _timerControllers[timerName];
+ GameObject.Destroy(timerController.gameObject);
+ _timerControllers.Remove(timerName);
+ }
+ }
+
+
+
+ public override void Dispose()
+ {
+ foreach (var controller in _timerControllers)
+ {
+ if (controller.Value != null)
+ {
+ GameObject.Destroy(controller.Value.gameObject);
+ }
+ }
+
+ GameObject.Destroy(timerSystem.gameObject);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs.meta b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs.meta
new file mode 100644
index 0000000..44a6523
--- /dev/null
+++ b/Assets/00.StaryEvo/Runtime/Tool/Timer/TimerSystem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8b5962b06d3756b41b29b0496e9e996f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/00.StaryEvo/package.json b/Assets/00.StaryEvo/package.json
index 5a7490d..cc63eb3 100644
--- a/Assets/00.StaryEvo/package.json
+++ b/Assets/00.StaryEvo/package.json
@@ -1,6 +1,6 @@
{
"name": "com.staryevo.main",
- "version": "2.1.14",
+ "version": "2.1.15",
"displayName": "00.StaryEvo",
"description": "This is an Framework package(后台服务器版本,端口9527)",
"unity": "2021.3",