|
|
@@ -1,25 +1,40 @@
|
|
|
-using System.Collections.Generic;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Reflection;
|
|
|
|
|
|
namespace Model
|
|
|
{
|
|
|
- public sealed class ObjectEvents
|
|
|
+ public interface IObjectEvent
|
|
|
{
|
|
|
- private static ObjectEvents instance;
|
|
|
+ Type Type();
|
|
|
+ void Set(object value);
|
|
|
+ }
|
|
|
|
|
|
+ public abstract class ObjectEvent<T> : IObjectEvent
|
|
|
+ {
|
|
|
+ private T value;
|
|
|
|
|
|
- private Queue<Disposer> loads = new Queue<Disposer>();
|
|
|
- private Queue<Disposer> loads2 = new Queue<Disposer>();
|
|
|
+ protected T Get()
|
|
|
+ {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
|
|
|
- private Queue<Disposer> starts = new Queue<Disposer>();
|
|
|
+ public void Set(object v)
|
|
|
+ {
|
|
|
+ this.value = (T)v;
|
|
|
+ }
|
|
|
|
|
|
- private Queue<Disposer> updates = new Queue<Disposer>();
|
|
|
- private Queue<Disposer> updates2 = new Queue<Disposer>();
|
|
|
+ public Type Type()
|
|
|
+ {
|
|
|
+ return typeof(T);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public sealed class ObjectEvents
|
|
|
+ {
|
|
|
+ private static ObjectEvents instance;
|
|
|
|
|
|
- private Queue<Disposer> lateUpdates = new Queue<Disposer>();
|
|
|
- private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
|
|
|
-
|
|
|
public static ObjectEvents Instance
|
|
|
{
|
|
|
get
|
|
|
@@ -28,73 +43,190 @@ namespace Model
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
|
|
|
+
|
|
|
+ private readonly Dictionary<Type, IObjectEvent> disposerEvents = new Dictionary<Type, IObjectEvent>();
|
|
|
+
|
|
|
+ private Queue<Disposer> updates = new Queue<Disposer>();
|
|
|
+ private Queue<Disposer> updates2 = new Queue<Disposer>();
|
|
|
+
|
|
|
+ private readonly Queue<Disposer> starts = new Queue<Disposer>();
|
|
|
+
|
|
|
+ private Queue<Disposer> loaders = new Queue<Disposer>();
|
|
|
+ private Queue<Disposer> loaders2 = new Queue<Disposer>();
|
|
|
+
|
|
|
+ private Queue<Disposer> lateUpdates = new Queue<Disposer>();
|
|
|
+ private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
|
|
|
+
|
|
|
public static void Close()
|
|
|
{
|
|
|
instance = null;
|
|
|
}
|
|
|
|
|
|
- private readonly Dictionary<string, Assembly> dictionary = new Dictionary<string, Assembly>();
|
|
|
-
|
|
|
public void Add(string name, Assembly assembly)
|
|
|
{
|
|
|
- this.dictionary[name] = assembly;
|
|
|
+ this.assemblies[name] = assembly;
|
|
|
+
|
|
|
+ this.disposerEvents.Clear();
|
|
|
+ foreach (Assembly ass in this.assemblies.Values)
|
|
|
+ {
|
|
|
+ Type[] types = ass.GetTypes();
|
|
|
+ foreach (Type type in types)
|
|
|
+ {
|
|
|
+ object[] attrs = type.GetCustomAttributes(typeof(ObjectEventAttribute), false);
|
|
|
+
|
|
|
+ if (attrs.Length == 0)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ object obj = Activator.CreateInstance(type);
|
|
|
+ IObjectEvent objectEvent = obj as IObjectEvent;
|
|
|
+ if (objectEvent == null)
|
|
|
+ {
|
|
|
+ Log.Error($"组件事件没有继承IObjectEvent: {type.Name}");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ this.disposerEvents[objectEvent.Type()] = objectEvent;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
this.Load();
|
|
|
}
|
|
|
|
|
|
- public void Remove(string name)
|
|
|
+ public Assembly Get(string name)
|
|
|
{
|
|
|
- this.dictionary.Remove(name);
|
|
|
+ return this.assemblies[name];
|
|
|
}
|
|
|
|
|
|
public Assembly[] GetAll()
|
|
|
{
|
|
|
- return this.dictionary.Values.ToArray();
|
|
|
+ return this.assemblies.Values.ToArray();
|
|
|
}
|
|
|
|
|
|
- public Assembly Get(string name)
|
|
|
+ public void Add(Disposer disposer)
|
|
|
{
|
|
|
- return this.dictionary[name];
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (objectEvent is ILoad)
|
|
|
+ {
|
|
|
+ this.loaders.Enqueue(disposer);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (objectEvent is IUpdate)
|
|
|
+ {
|
|
|
+ this.updates.Enqueue(disposer);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (objectEvent is IStart)
|
|
|
+ {
|
|
|
+ this.starts.Enqueue(disposer);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- public void Add(Disposer disposer)
|
|
|
+ public void Awake(Disposer disposer)
|
|
|
{
|
|
|
- if (disposer is ILoad)
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
{
|
|
|
- this.loads.Enqueue(disposer);
|
|
|
+ return;
|
|
|
}
|
|
|
+ IAwake iAwake = objectEvent as IAwake;
|
|
|
+ if (iAwake == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ iAwake.Awake();
|
|
|
+ }
|
|
|
|
|
|
- if (disposer is IStart)
|
|
|
+ public void Awake<P1>(Disposer disposer, P1 p1)
|
|
|
+ {
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
{
|
|
|
- this.starts.Enqueue(disposer);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ IAwake<P1> iAwake = objectEvent as IAwake<P1>;
|
|
|
+ if (iAwake == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
}
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ iAwake.Awake(p1);
|
|
|
+ }
|
|
|
|
|
|
- if (disposer is IUpdate)
|
|
|
+ public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
|
|
|
+ {
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
{
|
|
|
- this.updates.Enqueue(disposer);
|
|
|
+ return;
|
|
|
}
|
|
|
+ IAwake<P1, P2> iAwake = objectEvent as IAwake<P1, P2>;
|
|
|
+ if (iAwake == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ iAwake.Awake(p1, p2);
|
|
|
+ }
|
|
|
|
|
|
- if (disposer is ILateUpdate)
|
|
|
+ public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
|
|
|
+ {
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
{
|
|
|
- this.lateUpdates.Enqueue(disposer);
|
|
|
+ return;
|
|
|
}
|
|
|
+ IAwake<P1, P2, P3> iAwake = objectEvent as IAwake<P1, P2, P3>;
|
|
|
+ if (iAwake == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ iAwake.Awake(p1, p2, p3);
|
|
|
}
|
|
|
|
|
|
public void Load()
|
|
|
{
|
|
|
- while (this.loads.Count > 0)
|
|
|
+ while (this.loaders.Count > 0)
|
|
|
{
|
|
|
- Disposer disposer = this.loads.Dequeue();
|
|
|
+ Disposer disposer = this.loaders.Dequeue();
|
|
|
if (disposer.Id == 0)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- this.loads2.Enqueue(disposer);
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.loaders2.Enqueue(disposer);
|
|
|
|
|
|
- ((ILoad)disposer).Load();
|
|
|
+ ILoad iLoad = objectEvent as ILoad;
|
|
|
+ if (iLoad == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ iLoad.Load();
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Log.Error(e.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- ObjectHelper.Swap(ref this.loads, ref this.loads2);
|
|
|
+ ObjectHelper.Swap(ref this.loaders, ref this.loaders2);
|
|
|
}
|
|
|
|
|
|
private void Start()
|
|
|
@@ -102,12 +234,19 @@ namespace Model
|
|
|
while (this.starts.Count > 0)
|
|
|
{
|
|
|
Disposer disposer = this.starts.Dequeue();
|
|
|
- if (disposer.Id == 0)
|
|
|
+
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- ((IStart)disposer).Start();
|
|
|
+ IStart iStart = objectEvent as IStart;
|
|
|
+ if (iStart == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ iStart.Start();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -123,9 +262,28 @@ namespace Model
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
this.updates2.Enqueue(disposer);
|
|
|
|
|
|
- ((IUpdate)disposer).Update();
|
|
|
+ IUpdate iUpdate = objectEvent as IUpdate;
|
|
|
+ if (iUpdate == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ iUpdate.Update();
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Log.Error(e.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ObjectHelper.Swap(ref this.updates, ref this.updates2);
|
|
|
@@ -141,9 +299,28 @@ namespace Model
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ IObjectEvent objectEvent;
|
|
|
+ if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
this.lateUpdates2.Enqueue(disposer);
|
|
|
|
|
|
- ((ILateUpdate)disposer).LateUpdate();
|
|
|
+ ILateUpdate iLateUpdate = objectEvent as ILateUpdate;
|
|
|
+ if (iLateUpdate == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ objectEvent.Set(disposer);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ iLateUpdate.LateUpdate();
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Log.Error(e.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ObjectHelper.Swap(ref this.lateUpdates, ref this.lateUpdates2);
|