EntityEventManager.cs 6.7 KB
Newer Older
1 2 3
using System;
using System.Collections.Generic;
using System.Linq;
T
tanghai 已提交
4
using System.Text;
5 6
using ILRuntime.CLR.Method;

7 8
namespace Model
{
T
tanghai 已提交
9
	public class EntityTypeInfo
10
	{
T
tanghai 已提交
11
		private readonly Dictionary<EntityEventType, IStaticMethod> infos = new Dictionary<EntityEventType, IStaticMethod>();
12

T
tanghai 已提交
13
		public void Add(EntityEventType type, IStaticMethod methodInfo)
14
		{
15 16 17 18 19 20
			try
			{
				this.infos.Add(type, methodInfo);
			}
			catch (Exception e)
			{
T
tanghai 已提交
21
				throw new Exception($"Add EntityEventType MethodInfo Error: {type}", e);
22
			}
23 24
		}

T
tanghai 已提交
25
		public IStaticMethod Get(EntityEventType type)
26
		{
T
tanghai 已提交
27
			IStaticMethod methodInfo;
28 29
			this.infos.TryGetValue(type, out methodInfo);
			return methodInfo;
30 31
		}

T
tanghai 已提交
32
		public EntityEventType[] GetEntityEventTypes()
33
		{
34
			return this.infos.Keys.ToArray();
35
		}
T
tanghai 已提交
36 37 38 39

		public override string ToString()
		{
			StringBuilder sb = new StringBuilder();
T
tanghai 已提交
40
			foreach (EntityEventType disposerEventType in this.infos.Keys.ToArray())
T
tanghai 已提交
41 42 43 44 45
			{
				sb.Append($"{disposerEventType} {this.infos[disposerEventType].Name} ");
			}
			return sb.ToString();
		}
46 47
	}

48
	public sealed class EntityEventManager
49
	{
T
tanghai 已提交
50
		private readonly Dictionary<EntityEventType, HashSet<Disposer>> disposers = new Dictionary<EntityEventType, HashSet<Disposer>>();
51

T
tanghai 已提交
52 53 54
		private readonly HashSet<Disposer> addDisposers = new HashSet<Disposer>();
		private readonly HashSet<Disposer> removeDisposers = new HashSet<Disposer>();

55 56
		private Dictionary<int, EntityTypeInfo> eventInfo;
		private Dictionary<Type, int> typeToEntityEventId;
57 58
		
		public EntityEventManager()
59
		{
T
tanghai 已提交
60
			foreach (EntityEventType t in Enum.GetValues(typeof (EntityEventType)))
61 62 63
			{
				this.disposers.Add(t, new HashSet<Disposer>());
			}
T
tanghai 已提交
64

65 66 67 68 69 70 71 72 73 74
			LoadAssemblyInfo();

			this.Load();
		}

		public void LoadAssemblyInfo()
		{
			this.eventInfo = new Dictionary<int, EntityTypeInfo>();
			this.typeToEntityEventId = new Dictionary<Type, int>();

75
			Type[] types = DllHelper.GetAllTypes();
76 77
			List<string> allEntityType = Enum.GetNames(typeof(EntityEventType)).ToList();
			foreach (Type type in types)
78
			{
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
				object[] attrs = type.GetCustomAttributes(typeof(EntityEventAttribute), true);
				if (attrs.Length == 0)
				{
					continue;
				}

				EntityEventAttribute entityEventAttribute = attrs[0] as EntityEventAttribute;

				int entityEventId = entityEventAttribute.ClassType;

				this.typeToEntityEventId[type] = entityEventId;

				if (!this.eventInfo.ContainsKey(entityEventId))
				{
					this.eventInfo.Add(entityEventId, new EntityTypeInfo());
				}
95 96
				
				foreach (IMethod methodInfo in DllHelper.GetMethodInfo(type.FullName))
97 98 99
				{
					int n = methodInfo.ParameterCount;
					if (methodInfo.IsStatic)
100
					{
101
						--n;
102 103
					}

104 105
					string sn = n > 0 ? $"{methodInfo.Name}{n}" : methodInfo.Name;
					if (!allEntityType.Contains(sn))
106
					{
107
						continue;
108
					}
109 110

					EntityEventType t = EnumHelper.FromString<EntityEventType>(sn);
111 112
					IStaticMethod method = new ILStaticMethod(methodInfo, n);
					this.eventInfo[entityEventId].Add(t, method);
113 114 115
				}
			}
		}
116
		
117 118 119 120 121
		private int GetEntityEventIdByType(Type type)
		{
			int entityEventId = 0;
			this.typeToEntityEventId.TryGetValue(type, out entityEventId);
			return entityEventId;
122 123 124 125
		}

		public void Add(Disposer disposer)
		{
T
tanghai 已提交
126
			this.addDisposers.Add(disposer);
127 128 129 130
		}

		public void Remove(Disposer disposer)
		{
T
tanghai 已提交
131 132 133 134 135 136
			this.removeDisposers.Add(disposer);
		}

		private void UpdateAddDisposer()
		{
			foreach (Disposer disposer in this.addDisposers)
137
			{
T
tanghai 已提交
138
				EntityTypeInfo entityTypeInfo;
139
				if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
140 141 142 143 144 145 146 147
				{
					continue;
				}

				foreach (EntityEventType disposerEvent2Type in entityTypeInfo.GetEntityEventTypes())
				{
					this.disposers[disposerEvent2Type].Add(disposer);
				}
148
			}
T
tanghai 已提交
149 150
			this.addDisposers.Clear();
		}
151

T
tanghai 已提交
152 153 154
		private void UpdateRemoveDisposer()
		{
			foreach (Disposer disposer in this.removeDisposers)
155
			{
T
tanghai 已提交
156
				EntityTypeInfo entityTypeInfo;
157
				if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
158 159 160 161 162 163 164 165
				{
					continue;
				}

				foreach (EntityEventType disposerEvent2Type in entityTypeInfo.GetEntityEventTypes())
				{
					this.disposers[disposerEvent2Type].Remove(disposer);
				}
166
			}
T
tanghai 已提交
167
			this.removeDisposers.Clear();
168
		}
169

170
		private void Load()
171
		{
172
			HashSet<Disposer> list;
T
tanghai 已提交
173
			if (!this.disposers.TryGetValue(EntityEventType.Load, out list))
174 175 176
			{
				return;
			}
177
			foreach (Disposer disposer in list)
178
			{
179
				EntityTypeInfo entityTypeInfo = this.eventInfo[this.GetEntityEventIdByType(disposer.GetType())];
T
tanghai 已提交
180
				entityTypeInfo.Get(EntityEventType.Load).Run(disposer);
181 182 183
			}
		}

184
		public void Awake(Disposer disposer)
185
		{
T
tanghai 已提交
186
			EntityTypeInfo entityTypeInfo;
187
			if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
188 189 190
			{
				return;
			}
T
tanghai 已提交
191
			entityTypeInfo.Get(EntityEventType.Awake)?.Run(disposer);
192 193
		}

194
		public void Awake(Disposer disposer, object p1)
195
		{
T
tanghai 已提交
196
			EntityTypeInfo entityTypeInfo;
197
			if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
198 199 200
			{
				return;
			}
T
tanghai 已提交
201
			entityTypeInfo.Get(EntityEventType.Awake1)?.Run(disposer, p1);
202 203 204 205
		}

		public void Awake(Disposer disposer, object p1, object p2)
		{
T
tanghai 已提交
206
			EntityTypeInfo entityTypeInfo;
207
			if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
208 209 210 211
			{
				return;
			}
			entityTypeInfo.Get(EntityEventType.Awake2)?.Run(disposer, p1, p2);
212 213 214 215
		}

		public void Awake(Disposer disposer, object p1, object p2, object p3)
		{
T
tanghai 已提交
216
			EntityTypeInfo entityTypeInfo;
217
			if (!this.eventInfo.TryGetValue(this.GetEntityEventIdByType(disposer.GetType()), out entityTypeInfo))
T
tanghai 已提交
218 219 220 221
			{
				return;
			}
			entityTypeInfo.Get(EntityEventType.Awake3)?.Run(disposer, p1, p2, p3);
222
		}
223

224 225
		public void Update()
		{
T
tanghai 已提交
226 227
			UpdateAddDisposer();
			UpdateRemoveDisposer();
T
tanghai 已提交
228

229
			HashSet<Disposer> list;
T
tanghai 已提交
230
			if (!this.disposers.TryGetValue(EntityEventType.Update, out list))
231
			{
232 233 234 235
				return;
			}
			foreach (Disposer disposer in list)
			{
T
tanghai 已提交
236 237 238 239 240 241
				try
				{
					if (this.removeDisposers.Contains(disposer))
					{
						continue;
					}
242
					EntityTypeInfo entityTypeInfo = this.eventInfo[this.GetEntityEventIdByType(disposer.GetType())];
T
tanghai 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
					entityTypeInfo.Get(EntityEventType.Update).Run(disposer);
				}
				catch (Exception e)
				{
					Log.Error(e.ToString());
				}
			}
		}

		public void LateUpdate()
		{
			HashSet<Disposer> list;
			if (!this.disposers.TryGetValue(EntityEventType.LateUpdate, out list))
			{
				return;
			}
			foreach (Disposer disposer in list)
			{
				try
				{
263
					EntityTypeInfo entityTypeInfo = this.eventInfo[this.GetEntityEventIdByType(disposer.GetType())];
T
tanghai 已提交
264 265 266 267 268 269
					entityTypeInfo.Get(EntityEventType.LateUpdate).Run(disposer);
				}
				catch (Exception e)
				{
					Log.Error(e.ToString());
				}
270 271 272 273
			}
		}
	}
}