EventSystem.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using System;
  2. using System.Collections.Generic;
  3. using Model;
  4. namespace Hotfix
  5. {
  6. public interface IObjectSystem
  7. {
  8. Type Type();
  9. void Set(object value);
  10. }
  11. public abstract class ObjectSystem<T> : IObjectSystem
  12. {
  13. private T value;
  14. protected T Get()
  15. {
  16. return value;
  17. }
  18. public void Set(object v)
  19. {
  20. this.value = (T)v;
  21. }
  22. public Type Type()
  23. {
  24. return typeof(T);
  25. }
  26. }
  27. public sealed class EventSystem
  28. {
  29. private readonly Dictionary<Type, IObjectSystem> disposerEvents = new Dictionary<Type, IObjectSystem>();
  30. private Queue<Disposer> updates = new Queue<Disposer>();
  31. private Queue<Disposer> updates2 = new Queue<Disposer>();
  32. private readonly Queue<Disposer> starts = new Queue<Disposer>();
  33. private Queue<Disposer> loaders = new Queue<Disposer>();
  34. private Queue<Disposer> loaders2 = new Queue<Disposer>();
  35. private Queue<Disposer> lateUpdates = new Queue<Disposer>();
  36. private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
  37. public EventSystem()
  38. {
  39. this.disposerEvents.Clear();
  40. Type[] types = DllHelper.GetHotfixTypes();
  41. foreach (Type type in types)
  42. {
  43. object[] attrs = type.GetCustomAttributes(typeof(ObjectEventAttribute), false);
  44. if (attrs.Length == 0)
  45. {
  46. continue;
  47. }
  48. object obj = Activator.CreateInstance(type);
  49. IObjectSystem objectSystem = obj as IObjectSystem;
  50. if (objectSystem == null)
  51. {
  52. Log.Error($"组件事件没有继承IObjectEvent: {type.Name}");
  53. continue;
  54. }
  55. this.disposerEvents[objectSystem.Type()] = objectSystem;
  56. }
  57. this.Load();
  58. }
  59. public void Add(Disposer disposer)
  60. {
  61. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  62. {
  63. return;
  64. }
  65. if (objectEvent is ILoad)
  66. {
  67. this.loaders.Enqueue(disposer);
  68. }
  69. if (objectEvent is IUpdate)
  70. {
  71. this.updates.Enqueue(disposer);
  72. }
  73. if (objectEvent is IStart)
  74. {
  75. this.starts.Enqueue(disposer);
  76. }
  77. }
  78. public void Awake(Disposer disposer)
  79. {
  80. this.Add(disposer);
  81. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  82. {
  83. return;
  84. }
  85. IAwake iAwake = objectEvent as IAwake;
  86. if (iAwake == null)
  87. {
  88. return;
  89. }
  90. objectEvent.Set(disposer);
  91. iAwake.Awake();
  92. }
  93. public void Awake<P1>(Disposer disposer, P1 p1)
  94. {
  95. this.Add(disposer);
  96. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  97. {
  98. throw new Exception($"{disposer.GetType().Name} not found awake1");
  99. }
  100. IAwake<P1> iAwake = objectEvent as IAwake<P1>;
  101. if (iAwake == null)
  102. {
  103. throw new Exception($"{disposer.GetType().Name} not found awake1");
  104. }
  105. objectEvent.Set(disposer);
  106. iAwake.Awake(p1);
  107. }
  108. public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
  109. {
  110. this.Add(disposer);
  111. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  112. {
  113. throw new Exception($"{disposer.GetType().Name} not found awake2");
  114. }
  115. IAwake<P1, P2> iAwake = objectEvent as IAwake<P1, P2>;
  116. if (iAwake == null)
  117. {
  118. throw new Exception($"{disposer.GetType().Name} not found awake2");
  119. }
  120. objectEvent.Set(disposer);
  121. iAwake.Awake(p1, p2);
  122. }
  123. public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
  124. {
  125. this.Add(disposer);
  126. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  127. {
  128. throw new Exception($"{disposer.GetType().Name} not found awake3");
  129. }
  130. IAwake<P1, P2, P3> iAwake = objectEvent as IAwake<P1, P2, P3>;
  131. if (iAwake == null)
  132. {
  133. throw new Exception($"{disposer.GetType().Name} not found awake3");
  134. }
  135. objectEvent.Set(disposer);
  136. iAwake.Awake(p1, p2, p3);
  137. }
  138. public void Load()
  139. {
  140. while (this.loaders.Count > 0)
  141. {
  142. Disposer disposer = this.loaders.Dequeue();
  143. if (disposer.Id == 0)
  144. {
  145. continue;
  146. }
  147. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  148. {
  149. continue;
  150. }
  151. this.loaders2.Enqueue(disposer);
  152. ILoad iLoad = objectEvent as ILoad;
  153. if (iLoad == null)
  154. {
  155. continue;
  156. }
  157. objectEvent.Set(disposer);
  158. try
  159. {
  160. iLoad.Load();
  161. }
  162. catch (Exception e)
  163. {
  164. Log.Error(e.ToString());
  165. }
  166. }
  167. ObjectHelper.Swap(ref this.loaders, ref this.loaders2);
  168. }
  169. private void Start()
  170. {
  171. while (this.starts.Count > 0)
  172. {
  173. Disposer disposer = this.starts.Dequeue();
  174. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  175. {
  176. continue;
  177. }
  178. IStart iStart = objectEvent as IStart;
  179. if (iStart == null)
  180. {
  181. continue;
  182. }
  183. objectEvent.Set(disposer);
  184. iStart.Start();
  185. }
  186. }
  187. public void Update()
  188. {
  189. this.Start();
  190. while (this.updates.Count > 0)
  191. {
  192. Disposer disposer = this.updates.Dequeue();
  193. if (disposer.Id == 0)
  194. {
  195. continue;
  196. }
  197. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
  198. {
  199. continue;
  200. }
  201. this.updates2.Enqueue(disposer);
  202. IUpdate iUpdate = objectEvent as IUpdate;
  203. if (iUpdate == null)
  204. {
  205. continue;
  206. }
  207. objectEvent.Set(disposer);
  208. try
  209. {
  210. iUpdate.Update();
  211. }
  212. catch (Exception e)
  213. {
  214. Log.Error(e.ToString());
  215. }
  216. }
  217. ObjectHelper.Swap(ref this.updates, ref this.updates2);
  218. }
  219. public void LateUpdate()
  220. {
  221. while (this.lateUpdates.Count > 0)
  222. {
  223. Disposer disposer = this.lateUpdates.Dequeue();
  224. if (disposer.Id == 0)
  225. {
  226. continue;
  227. }
  228. IObjectSystem objectSystem;
  229. if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
  230. {
  231. continue;
  232. }
  233. this.lateUpdates2.Enqueue(disposer);
  234. ILateUpdate iLateUpdate = objectSystem as ILateUpdate;
  235. if (iLateUpdate == null)
  236. {
  237. continue;
  238. }
  239. objectSystem.Set(disposer);
  240. try
  241. {
  242. iLateUpdate.LateUpdate();
  243. }
  244. catch (Exception e)
  245. {
  246. Log.Error(e.ToString());
  247. }
  248. }
  249. ObjectHelper.Swap(ref this.lateUpdates, ref this.lateUpdates2);
  250. }
  251. }
  252. }