EventSystem.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. namespace Model
  6. {
  7. public enum DLLType
  8. {
  9. Model,
  10. Hotfix,
  11. Editor,
  12. }
  13. public sealed class EventSystem
  14. {
  15. private readonly Dictionary<DLLType, Assembly> assemblies = new Dictionary<DLLType, Assembly>();
  16. private readonly Dictionary<EventIdType, List<object>> allEvents = new Dictionary<EventIdType, List<object>>();
  17. private readonly UnOrderMultiMap<Type, AAwakeSystem> awakeEvents = new UnOrderMultiMap<Type, AAwakeSystem>();
  18. private readonly UnOrderMultiMap<Type, AStartSystem> startEvents = new UnOrderMultiMap<Type, AStartSystem>();
  19. private readonly UnOrderMultiMap<Type, ALoadSystem> loadEvents = new UnOrderMultiMap<Type, ALoadSystem>();
  20. private readonly UnOrderMultiMap<Type, AUpdateSystem> updateEvents = new UnOrderMultiMap<Type, AUpdateSystem>();
  21. private readonly UnOrderMultiMap<Type, ALateUpdateSystem> lateUpdateEvents = new UnOrderMultiMap<Type, ALateUpdateSystem>();
  22. private Queue<Component> updates = new Queue<Component>();
  23. private Queue<Component> updates2 = new Queue<Component>();
  24. private readonly Queue<Component> starts = new Queue<Component>();
  25. private Queue<Component> loaders = new Queue<Component>();
  26. private Queue<Component> loaders2 = new Queue<Component>();
  27. private readonly HashSet<Disposer> unique = new HashSet<Disposer>();
  28. public void Add(DLLType dllType, Assembly assembly)
  29. {
  30. this.assemblies[dllType] = assembly;
  31. this.awakeEvents.Clear();
  32. this.lateUpdateEvents.Clear();
  33. this.updateEvents.Clear();
  34. this.startEvents.Clear();
  35. this.loadEvents.Clear();
  36. Type[] types = DllHelper.GetMonoTypes();
  37. foreach (Type type in types)
  38. {
  39. object[] attrs = type.GetCustomAttributes(typeof(ObjectSystemAttribute), false);
  40. if (attrs.Length == 0)
  41. {
  42. continue;
  43. }
  44. object obj = Activator.CreateInstance(type);
  45. AAwakeSystem objectSystem = obj as AAwakeSystem;
  46. if (objectSystem != null)
  47. {
  48. this.awakeEvents.Add(objectSystem.Type(), objectSystem);
  49. }
  50. AUpdateSystem aUpdateSystem = obj as AUpdateSystem;
  51. if (aUpdateSystem != null)
  52. {
  53. this.updateEvents.Add(aUpdateSystem.Type(), aUpdateSystem);
  54. }
  55. ALateUpdateSystem aLateUpdateSystem = obj as ALateUpdateSystem;
  56. if (aLateUpdateSystem != null)
  57. {
  58. this.lateUpdateEvents.Add(aLateUpdateSystem.Type(), aLateUpdateSystem);
  59. }
  60. AStartSystem aStartSystem = obj as AStartSystem;
  61. if (aStartSystem != null)
  62. {
  63. this.startEvents.Add(aStartSystem.Type(), aStartSystem);
  64. }
  65. ALoadSystem aLoadSystem = obj as ALoadSystem;
  66. if (aLoadSystem != null)
  67. {
  68. this.loadEvents.Add(aLoadSystem.Type(), aLoadSystem);
  69. }
  70. }
  71. allEvents.Clear();
  72. foreach (Type type in types)
  73. {
  74. object[] attrs = type.GetCustomAttributes(typeof(EventAttribute), false);
  75. foreach (object attr in attrs)
  76. {
  77. EventAttribute aEventAttribute = (EventAttribute)attr;
  78. object obj = Activator.CreateInstance(type);
  79. if (!this.allEvents.ContainsKey((EventIdType)aEventAttribute.Type))
  80. {
  81. this.allEvents.Add((EventIdType)aEventAttribute.Type, new List<object>());
  82. }
  83. this.allEvents[(EventIdType)aEventAttribute.Type].Add(obj);
  84. }
  85. }
  86. this.Load();
  87. }
  88. public Assembly Get(DLLType dllType)
  89. {
  90. return this.assemblies[dllType];
  91. }
  92. public Assembly[] GetAll()
  93. {
  94. return this.assemblies.Values.ToArray();
  95. }
  96. public void Add(Component disposer)
  97. {
  98. Type type = disposer.GetType();
  99. if (this.loadEvents.ContainsKey(type))
  100. {
  101. this.loaders.Enqueue(disposer);
  102. }
  103. if (this.updateEvents.ContainsKey(type))
  104. {
  105. this.updates.Enqueue(disposer);
  106. }
  107. if (this.startEvents.ContainsKey(type))
  108. {
  109. this.starts.Enqueue(disposer);
  110. }
  111. }
  112. public void Awake(Component disposer)
  113. {
  114. this.Add(disposer);
  115. List<AAwakeSystem> iAwakeSystems = this.awakeEvents[disposer.GetType()];
  116. if (iAwakeSystems == null)
  117. {
  118. return;
  119. }
  120. foreach (AAwakeSystem aAwakeSystem in iAwakeSystems)
  121. {
  122. if (aAwakeSystem == null)
  123. {
  124. continue;
  125. }
  126. aAwakeSystem.Run(disposer);
  127. }
  128. }
  129. public void Awake<P1>(Component disposer, P1 p1)
  130. {
  131. this.Add(disposer);
  132. List<AAwakeSystem> iAwakeSystems = this.awakeEvents[disposer.GetType()];
  133. if (iAwakeSystems == null)
  134. {
  135. return;
  136. }
  137. foreach (AAwakeSystem aAwakeSystem in iAwakeSystems)
  138. {
  139. if (aAwakeSystem == null)
  140. {
  141. continue;
  142. }
  143. aAwakeSystem.Run(disposer, p1);
  144. }
  145. }
  146. public void Awake<P1, P2>(Component disposer, P1 p1, P2 p2)
  147. {
  148. this.Add(disposer);
  149. List<AAwakeSystem> iAwakeSystems = this.awakeEvents[disposer.GetType()];
  150. if (iAwakeSystems == null)
  151. {
  152. return;
  153. }
  154. foreach (AAwakeSystem aAwakeSystem in iAwakeSystems)
  155. {
  156. if (aAwakeSystem == null)
  157. {
  158. continue;
  159. }
  160. aAwakeSystem.Run(disposer, p1, p2);
  161. }
  162. }
  163. public void Awake<P1, P2, P3>(Component disposer, P1 p1, P2 p2, P3 p3)
  164. {
  165. this.Add(disposer);
  166. List<AAwakeSystem> iAwakeSystems = this.awakeEvents[disposer.GetType()];
  167. if (iAwakeSystems == null)
  168. {
  169. return;
  170. }
  171. foreach (AAwakeSystem aAwakeSystem in iAwakeSystems)
  172. {
  173. if (aAwakeSystem == null)
  174. {
  175. continue;
  176. }
  177. aAwakeSystem.Run(disposer, p1, p2, p3);
  178. }
  179. }
  180. public void Load()
  181. {
  182. unique.Clear();
  183. while (this.loaders.Count > 0)
  184. {
  185. Component disposer = this.loaders.Dequeue();
  186. if (disposer.IsDisposed)
  187. {
  188. continue;
  189. }
  190. if (!this.unique.Add(disposer))
  191. {
  192. continue;
  193. }
  194. List<ALoadSystem> aLoadSystems = this.loadEvents[disposer.GetType()];
  195. if (aLoadSystems == null)
  196. {
  197. continue;
  198. }
  199. this.loaders2.Enqueue(disposer);
  200. foreach (ALoadSystem aLoadSystem in aLoadSystems)
  201. {
  202. try
  203. {
  204. aLoadSystem.Run(disposer);
  205. }
  206. catch (Exception e)
  207. {
  208. Log.Error(e.ToString());
  209. }
  210. }
  211. }
  212. ObjectHelper.Swap(ref this.loaders, ref this.loaders2);
  213. }
  214. private void Start()
  215. {
  216. unique.Clear();
  217. while (this.starts.Count > 0)
  218. {
  219. Component disposer = this.starts.Dequeue();
  220. if (!this.unique.Add(disposer))
  221. {
  222. continue;
  223. }
  224. List<AStartSystem> aStartSystems = this.startEvents[disposer.GetType()];
  225. if (aStartSystems == null)
  226. {
  227. continue;
  228. }
  229. foreach (AStartSystem aStartSystem in aStartSystems)
  230. {
  231. try
  232. {
  233. aStartSystem.Run(disposer);
  234. }
  235. catch (Exception e)
  236. {
  237. Log.Error(e.ToString());
  238. }
  239. }
  240. }
  241. }
  242. public void Update()
  243. {
  244. this.Start();
  245. this.unique.Clear();
  246. while (this.updates.Count > 0)
  247. {
  248. Component disposer = this.updates.Dequeue();
  249. if (disposer.IsDisposed)
  250. {
  251. continue;
  252. }
  253. if (!this.unique.Add(disposer))
  254. {
  255. continue;
  256. }
  257. List<AUpdateSystem> aUpdateSystems = this.updateEvents[disposer.GetType()];
  258. if (aUpdateSystems == null)
  259. {
  260. continue;
  261. }
  262. this.updates2.Enqueue(disposer);
  263. foreach (AUpdateSystem aUpdateSystem in aUpdateSystems)
  264. {
  265. try
  266. {
  267. aUpdateSystem.Run(disposer);
  268. }
  269. catch (Exception e)
  270. {
  271. Log.Error(e.ToString());
  272. }
  273. }
  274. }
  275. ObjectHelper.Swap(ref this.updates, ref this.updates2);
  276. }
  277. public void Run(EventIdType type)
  278. {
  279. List<object> iEvents;
  280. if (!this.allEvents.TryGetValue(type, out iEvents))
  281. {
  282. return;
  283. }
  284. foreach (object obj in iEvents)
  285. {
  286. try
  287. {
  288. IEvent iEvent = (IEvent)obj;
  289. iEvent.Run();
  290. }
  291. catch (Exception e)
  292. {
  293. Log.Error(e.ToString());
  294. }
  295. }
  296. }
  297. public void Run<A>(EventIdType type, A a)
  298. {
  299. List<object> iEvents;
  300. if (!this.allEvents.TryGetValue(type, out iEvents))
  301. {
  302. return;
  303. }
  304. foreach (object obj in iEvents)
  305. {
  306. try
  307. {
  308. IEvent<A> iEvent = (IEvent<A>)obj;
  309. iEvent.Run(a);
  310. }
  311. catch (Exception err)
  312. {
  313. Log.Error(err.ToString());
  314. }
  315. }
  316. }
  317. public void Run<A, B>(EventIdType type, A a, B b)
  318. {
  319. List<object> iEvents;
  320. if (!this.allEvents.TryGetValue(type, out iEvents))
  321. {
  322. return;
  323. }
  324. foreach (object obj in iEvents)
  325. {
  326. try
  327. {
  328. IEvent<A, B> iEvent = (IEvent<A, B>)obj;
  329. iEvent.Run(a, b);
  330. }
  331. catch (Exception err)
  332. {
  333. Log.Error(err.ToString());
  334. }
  335. }
  336. }
  337. public void Run<A, B, C>(EventIdType type, A a, B b, C c)
  338. {
  339. List<object> iEvents;
  340. if (!this.allEvents.TryGetValue(type, out iEvents))
  341. {
  342. return;
  343. }
  344. foreach (object obj in iEvents)
  345. {
  346. try
  347. {
  348. IEvent<A, B, C> iEvent = (IEvent<A, B, C>)obj;
  349. iEvent.Run(a, b, c);
  350. }
  351. catch (Exception err)
  352. {
  353. Log.Error(err.ToString());
  354. }
  355. }
  356. }
  357. }
  358. }