Просмотр исходного кода

调整Entity和Component继承关系,从继承Object改成继承Disposer,Disposer继承于Object

tanghai 9 лет назад
Родитель
Сommit
1da8e6fdf4
38 измененных файлов с 475 добавлено и 384 удалено
  1. 7 3
      Server/App/Program.cs
  2. 1 1
      Server/Controller/Message/M2A_ReloadHandler.cs
  3. 2 2
      Server/Model/Component/AppManagerComponent.cs
  4. 2 2
      Server/Model/Component/GateSessionKeyComponent.cs
  5. 2 2
      Server/Model/Component/RealmGateAddressComponent.cs
  6. 2 2
      Server/Model/Component/StartConfigComponent.cs
  7. 12 6
      Server/Model/Server.Model.csproj
  8. 3 3
      Unity/Assets/Editor/EditorInit.cs
  9. 2 2
      Unity/Assets/Editor/ObjectManagerToolsEditor/ObjectManagerToolsWindow.cs
  10. 2 2
      Unity/Assets/Scripts/Component/BenchmakComponent.cs
  11. 2 2
      Unity/Assets/Scripts/Component/ClientConfigComponent.cs
  12. 1 1
      Unity/Assets/Scripts/Component/ConfigComponent.cs
  13. 3 3
      Unity/Assets/Scripts/Component/EventComponent.cs
  14. 2 2
      Unity/Assets/Scripts/Component/GameObjectComponent.cs
  15. 3 3
      Unity/Assets/Scripts/Component/MessageDispatherComponent.cs
  16. 2 2
      Unity/Assets/Scripts/Component/NetInnerComponent.cs
  17. 2 2
      Unity/Assets/Scripts/Component/NetOuterComponent.cs
  18. 2 2
      Unity/Assets/Scripts/Component/RobotComponent.cs
  19. 2 2
      Unity/Assets/Scripts/Component/TimerComponent.cs
  20. 3 3
      Unity/Assets/Scripts/Component/UIComponent.cs
  21. 9 0
      Unity/Assets/Scripts/Component/Unit.meta
  22. 30 0
      Unity/Assets/Scripts/Entity/Unit.cs
  23. 12 0
      Unity/Assets/Scripts/Entity/Unit.cs.meta
  24. 3 3
      Unity/Assets/Scripts/Init.cs
  25. 2 7
      Unity/Assets/Scripts/Object/Component.cs
  26. 24 0
      Unity/Assets/Scripts/Object/Disposer.cs
  27. 12 0
      Unity/Assets/Scripts/Object/Disposer.cs.meta
  28. 1 1
      Unity/Assets/Scripts/Object/DisposerEventAttribute.cs
  29. 0 0
      Unity/Assets/Scripts/Object/DisposerEventAttribute.cs.meta
  30. 299 0
      Unity/Assets/Scripts/Object/DisposerManager.cs
  31. 0 0
      Unity/Assets/Scripts/Object/DisposerManager.cs.meta
  32. 7 10
      Unity/Assets/Scripts/Object/Entity.cs
  33. 1 0
      Unity/Assets/Scripts/Object/EntityType.cs
  34. 10 5
      Unity/Assets/Scripts/Object/Object.cs
  35. 0 299
      Unity/Assets/Scripts/Object/ObjectManager.cs
  36. 0 8
      Unity/Controller/Unity.Controller.csproj
  37. BIN
      Unity/ProjectSettings/EditorSettings.asset
  38. 8 4
      Unity/Unity.csproj

+ 7 - 3
Server/App/Program.cs

@@ -1,6 +1,7 @@
 using System;
 using Base;
 using Model;
+using MongoDB.Bson;
 using NLog;
 
 namespace App
@@ -11,8 +12,8 @@ namespace App
 		{
 			try
 			{
-				ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
-				ObjectManager.Instance.Register("Controller", DllHelper.GetController());
+				DisposerManager.Instance.Register("Model", typeof(Game).Assembly);
+				DisposerManager.Instance.Register("Controller", DllHelper.GetController());
 
 				StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string[]>(args).MyConfig;
 
@@ -23,6 +24,9 @@ namespace App
 
 				Log.Info("server start........................");
 
+				Unit unit = new Unit(UnitType.Hero);
+				Log.Debug(unit.ToJson());
+				
 				Game.Scene.AddComponent<EventComponent>();
 				Game.Scene.AddComponent<TimerComponent>();
 				
@@ -66,7 +70,7 @@ namespace App
 
 				while (true)
 				{
-					ObjectManager.Instance.Update();
+					DisposerManager.Instance.Update();
 				}
 			}
 			catch (Exception e)

+ 1 - 1
Server/Controller/Message/M2A_ReloadHandler.cs

@@ -12,7 +12,7 @@ namespace Controller
 			A2M_Reload a2MReload = new A2M_Reload();
 			try
 			{
-				ObjectManager.Instance.Register("Controller", DllHelper.GetController());
+				DisposerManager.Instance.Register("Controller", DllHelper.GetController());
 			}
 			catch (Exception e)
 			{

+ 2 - 2
Server/Model/Component/AppManagerComponent.cs

@@ -6,8 +6,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class AppManagerComponentEvent : ObjectEvent<AppManagerComponent>, IAwake
+	[DisposerEvent]
+	public class AppManagerComponentEvent : DisposerEvent<AppManagerComponent>, IAwake
 	{
 		public void Awake()
 		{

+ 2 - 2
Server/Model/Component/GateSessionKeyComponent.cs

@@ -3,8 +3,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class GateSessionKeyComponentEvent : ObjectEvent<GateSessionKeyComponent>, IAwake
+	[DisposerEvent]
+	public class GateSessionKeyComponentEvent : DisposerEvent<GateSessionKeyComponent>, IAwake
 	{
 		public void Awake()
 		{

+ 2 - 2
Server/Model/Component/RealmGateAddressComponent.cs

@@ -3,8 +3,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class RealmGateAddressComponentEvent : ObjectEvent<RealmGateAddressComponent>, IAwake
+	[DisposerEvent]
+	public class RealmGateAddressComponentEvent : DisposerEvent<RealmGateAddressComponent>, IAwake
 	{
 		public void Awake()
 		{

+ 2 - 2
Server/Model/Component/StartConfigComponent.cs

@@ -6,8 +6,8 @@ using CommandLine;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class StartConfigComponentEvent : ObjectEvent<StartConfigComponent>, IAwake<string[]>
+	[DisposerEvent]
+	public class StartConfigComponentEvent : DisposerEvent<StartConfigComponent>, IAwake<string[]>
 	{
 		public void Awake(string[] args)
 		{

+ 12 - 6
Server/Model/Server.Model.csproj

@@ -113,6 +113,9 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Entity\Session.cs">
       <Link>Entity\Session.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Entity\Unit.cs">
+      <Link>Entity\Unit.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Event\AEventAttribute.cs">
       <Link>Event\AEventAttribute.cs</Link>
     </Compile>
@@ -161,6 +164,15 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Object\Component.cs">
       <Link>Object\Component.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Object\Disposer.cs">
+      <Link>Object\Disposer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Object\DisposerEventAttribute.cs">
+      <Link>Object\DisposerEventAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Object\DisposerManager.cs">
+      <Link>Object\DisposerManager.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Object\Entity.cs">
       <Link>Object\Entity.cs</Link>
     </Compile>
@@ -179,12 +191,6 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Object\Object.cs">
       <Link>Object\Object.cs</Link>
     </Compile>
-    <Compile Include="..\..\Unity\Assets\Scripts\Object\ObjectEventAttribute.cs">
-      <Link>Object\ObjectEventAttribute.cs</Link>
-    </Compile>
-    <Compile Include="..\..\Unity\Assets\Scripts\Object\ObjectManager.cs">
-      <Link>Object\ObjectManager.cs</Link>
-    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Other\Options.cs">
       <Link>Other\Options.cs</Link>
     </Compile>

+ 3 - 3
Unity/Assets/Editor/EditorInit.cs

@@ -11,7 +11,7 @@ namespace MyEditor
 	{
 		static EditorInit()
 		{
-			ObjectManager.Instance.Register("Editor", typeof(EditorInit).Assembly);
+			DisposerManager.Instance.Register("Editor", typeof(EditorInit).Assembly);
 			EditorApplication.update += Update;
 		}
 
@@ -24,11 +24,11 @@ namespace MyEditor
 
 			try
 			{
-				ObjectManager.Instance.Update();
+				DisposerManager.Instance.Update();
 			}
 			catch (Exception e)
 			{
-				ObjectManager.Reset();
+				DisposerManager.Reset();
 				Log.Error(e.ToString());
 			}
 		}

+ 2 - 2
Unity/Assets/Editor/ObjectManagerToolsEditor/ObjectManagerToolsWindow.cs

@@ -7,13 +7,13 @@ public class ObjectManagerToolsWindow : EditorWindow
 	[MenuItem("Tools/ObjectManagerTools/显示未Dispose的对象")]
 	private static void ShowUnDisposeObjects()
 	{
-		Log.Info(ObjectManager.Instance.ToString());
+		Log.Info(DisposerManager.Instance.ToString());
 	}
 	
 
 	[MenuItem("Tools/ObjectManagerTools/清除所有对象")]
 	private static void ClearAllObjects()
 	{
-		ObjectManager.Reset();
+		DisposerManager.Reset();
 	}
 }

+ 2 - 2
Unity/Assets/Scripts/Component/BenchmakComponent.cs

@@ -3,8 +3,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class BenchmakComponentEvent : ObjectEvent<BenchmakComponent>, IAwake<string>
+	[DisposerEvent]
+	public class BenchmakComponentEvent : DisposerEvent<BenchmakComponent>, IAwake<string>
 	{
 		public void Awake(string address)
 		{

+ 2 - 2
Unity/Assets/Scripts/Component/ClientConfigComponent.cs

@@ -3,8 +3,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class ClientConfigComponentEvent : ObjectEvent<ClientConfigComponent>, IAwake
+	[DisposerEvent]
+	public class ClientConfigComponentEvent : DisposerEvent<ClientConfigComponent>, IAwake
 	{
 		public void Awake()
 		{

+ 1 - 1
Unity/Assets/Scripts/Component/ConfigComponent.cs

@@ -10,7 +10,7 @@ namespace Model
 
 		public void Load()
 		{
-			Assembly assembly = ObjectManager.Instance.GetAssembly("Base");
+			Assembly assembly = DisposerManager.Instance.GetAssembly("Base");
 
 			this.allConfig = new Dictionary<Type, ICategory>();
 			Type[] types = assembly.GetTypes();

+ 3 - 3
Unity/Assets/Scripts/Component/EventComponent.cs

@@ -5,8 +5,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class EventComponentEvent : ObjectEvent<EventComponent>, ILoader, IAwake
+	[DisposerEvent]
+	public class EventComponentEvent : DisposerEvent<EventComponent>, ILoader, IAwake
 	{
 		public void Load()
 		{
@@ -29,7 +29,7 @@ namespace Model
 		public void Load()
 		{
 			this.allEvents = new Dictionary<EventIdType, List<object>>();
-			Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
+			Assembly[] assemblies = DisposerManager.Instance.GetAssemblies();
 			foreach (Assembly assembly in assemblies)
 			{
 				Type[] types = assembly.GetTypes();

+ 2 - 2
Unity/Assets/Scripts/Component/GameObjectComponent.cs

@@ -4,8 +4,8 @@ using Component = UnityEngine.Component;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class GameObjectComponentEvent : ObjectEvent<GameObjectComponent>, IAwake<GameObject>
+	[DisposerEvent]
+	public class GameObjectComponentEvent : DisposerEvent<GameObjectComponent>, IAwake<GameObject>
 	{
 		public void Awake(GameObject gameObject)
 		{

+ 3 - 3
Unity/Assets/Scripts/Component/MessageDispatherComponent.cs

@@ -5,8 +5,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class MessageHandlerComponentEvent : ObjectEvent<MessageDispatherComponent>, ILoader, IAwake<AppType>
+	[DisposerEvent]
+	public class MessageHandlerComponentEvent : DisposerEvent<MessageDispatherComponent>, ILoader, IAwake<AppType>
 	{
 		public void Load()
 		{
@@ -40,7 +40,7 @@ namespace Model
 			this.handlers = new Dictionary<ushort, List<IMHandler>>();
 			this.messageOpcode = new Dictionary<Type, MessageAttribute>();
 
-			Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
+			Assembly[] assemblies = DisposerManager.Instance.GetAssemblies();
 
 			foreach (Assembly assembly in assemblies)
 			{

+ 2 - 2
Unity/Assets/Scripts/Component/NetInnerComponent.cs

@@ -3,8 +3,8 @@ using Base;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class NetInnerComponentEvent : ObjectEvent<NetInnerComponent>, IUpdate, IAwake, IAwake<string, int>
+	[DisposerEvent]
+	public class NetInnerComponentEvent : DisposerEvent<NetInnerComponent>, IUpdate, IAwake, IAwake<string, int>
 	{
 		public void Update()
 		{

+ 2 - 2
Unity/Assets/Scripts/Component/NetOuterComponent.cs

@@ -2,8 +2,8 @@
 
 namespace Model
 {
-	[ObjectEvent]
-	public class NetOuterComponentEvent : ObjectEvent<NetOuterComponent>, IUpdate, IAwake, IAwake<string, int>
+	[DisposerEvent]
+	public class NetOuterComponentEvent : DisposerEvent<NetOuterComponent>, IUpdate, IAwake, IAwake<string, int>
 	{
 		public void Update()
 		{

+ 2 - 2
Unity/Assets/Scripts/Component/RobotComponent.cs

@@ -2,8 +2,8 @@
 
 namespace Model
 {
-	[ObjectEvent]
-	public class RobotComponentEvent : ObjectEvent<RobotComponent>, IAwake
+	[DisposerEvent]
+	public class RobotComponentEvent : DisposerEvent<RobotComponent>, IAwake
 	{
 		public void Awake()
 		{

+ 2 - 2
Unity/Assets/Scripts/Component/TimerComponent.cs

@@ -12,8 +12,8 @@ namespace Model
 		public TaskCompletionSource<bool> tcs;
 	}
 
-	[ObjectEvent]
-	public class TimerComponentEvent : ObjectEvent<TimerComponent>, IUpdate
+	[DisposerEvent]
+	public class TimerComponentEvent : DisposerEvent<TimerComponent>, IUpdate
 	{
 		public void Update()
 		{

+ 3 - 3
Unity/Assets/Scripts/Component/UIComponent.cs

@@ -6,8 +6,8 @@ using UnityEngine;
 
 namespace Model
 {
-	[ObjectEvent]
-	public class UIComponentEvent : ObjectEvent<UIComponent>, IAwake, ILoader
+	[DisposerEvent]
+	public class UIComponentEvent : DisposerEvent<UIComponent>, IAwake, ILoader
 	{
 		public void Load()
 		{
@@ -63,7 +63,7 @@ namespace Model
 		{
 			this.UiTypes = new Dictionary<UIType, IUIFactory>();
 
-			Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
+			Assembly[] assemblies = DisposerManager.Instance.GetAssemblies();
 			foreach (Assembly assembly in assemblies)
 			{
 				Type[] types = assembly.GetTypes();

+ 9 - 0
Unity/Assets/Scripts/Component/Unit.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a6777dcb4aea2ef4fb129b4bfd059aa7
+folderAsset: yes
+timeCreated: 1479442397
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 30 - 0
Unity/Assets/Scripts/Entity/Unit.cs

@@ -0,0 +1,30 @@
+using Base;
+
+namespace Model
+{
+	public enum UnitType
+	{
+		Hero,
+		Npc,
+	}
+
+	public sealed class Unit: Entity
+	{
+		public UnitType UnitType { get; }
+		
+		public override void Dispose()
+		{
+			if (this.Id == 0)
+			{
+				return;
+			}
+
+			base.Dispose();
+		}
+		
+		public Unit(UnitType unitType) : base(EntityType.UI)
+		{
+			this.UnitType = unitType;
+		}
+	}
+}

+ 12 - 0
Unity/Assets/Scripts/Entity/Unit.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4da2290eec277924c88e511d3e4ae7b9
+timeCreated: 1479694292
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 3 - 3
Unity/Assets/Scripts/Init.cs

@@ -8,8 +8,8 @@ namespace Model
 	{
 		private void Start()
 		{
-			ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
-			ObjectManager.Instance.Register("Controller", DllHelper.GetController());
+			DisposerManager.Instance.Register("Model", typeof(Game).Assembly);
+			DisposerManager.Instance.Register("Controller", DllHelper.GetController());
 
 			Game.Scene.AddComponent<EventComponent>().Run(EventIdType.InitSceneStart);
 		}
@@ -18,7 +18,7 @@ namespace Model
 		{
 			try
 			{
-				ObjectManager.Instance.Update();
+				DisposerManager.Instance.Update();
 			}
 			catch (Exception e)
 			{

+ 2 - 7
Unity/Assets/Scripts/Object/Component.cs

@@ -1,10 +1,9 @@
-using System;
-using MongoDB.Bson.Serialization.Attributes;
+using MongoDB.Bson.Serialization.Attributes;
 
 namespace Model
 {
 	[BsonKnownTypes(typeof(AConfigComponent))]
-	public abstract class Component : Object, IDisposable
+	public abstract class Component : Disposer
 	{
 		[BsonIgnore]
 		public Entity Owner { get; set; }
@@ -16,12 +15,10 @@ namespace Model
 
 		protected Component()
 		{
-			ObjectManager.Instance.Add(this);
 		}
 
 		protected Component(long id): base(id)
 		{
-			ObjectManager.Instance.Add(this);
 		}
 
 		protected T GetComponent<T>() where T: Component
@@ -37,8 +34,6 @@ namespace Model
 			}
 
 			base.Dispose();
-			
-			ObjectManager.Instance.Remove(this);
 		}
 	}
 }

+ 24 - 0
Unity/Assets/Scripts/Object/Disposer.cs

@@ -0,0 +1,24 @@
+using System;
+using Base;
+
+namespace Model
+{
+	public abstract class Disposer : Object, IDisposable 
+	{
+		protected Disposer(): base(IdGenerater.GenerateId())
+		{
+			DisposerManager.Instance.Add(this);
+		}
+
+		protected Disposer(long id): base(id)
+		{
+			DisposerManager.Instance.Add(this);
+		}
+
+		public virtual void Dispose()
+		{
+			DisposerManager.Instance.Remove(this);
+			this.Id = 0;
+		}
+	}
+}

+ 12 - 0
Unity/Assets/Scripts/Object/Disposer.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 785b1815942ba374b9cea238401cd506
+timeCreated: 1479695006
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Unity/Assets/Scripts/Object/ObjectEventAttribute.cs → Unity/Assets/Scripts/Object/DisposerEventAttribute.cs

@@ -3,7 +3,7 @@
 namespace Model
 {
 	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
-	public class ObjectEventAttribute: Attribute
+	public class DisposerEventAttribute: Attribute
 	{
 	}
 }

+ 0 - 0
Unity/Assets/Scripts/Object/ObjectEventAttribute.cs.meta → Unity/Assets/Scripts/Object/DisposerEventAttribute.cs.meta


+ 299 - 0
Unity/Assets/Scripts/Object/DisposerManager.cs

@@ -0,0 +1,299 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using Base;
+
+namespace Model
+{
+	public interface IDisposerEvent
+	{
+		Type ValueType();
+		void SetValue(object value);
+	}
+
+	public abstract class DisposerEvent<T> : IDisposerEvent
+	{
+		private T value;
+
+		protected T GetValue()
+		{
+			return value;
+		}
+
+		public void SetValue(object v)
+		{
+			this.value = (T)v;
+		}
+
+		public Type ValueType()
+		{
+			return typeof(T);
+		}
+	}
+
+	public sealed class DisposerManager : IDisposable
+	{
+		private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
+
+		private Dictionary<Type, IDisposerEvent> disposerEvents;
+
+		private readonly HashSet<Disposer> disposers = new HashSet<Disposer>();
+		private readonly HashSet<Disposer> updates = new HashSet<Disposer>();
+		private readonly HashSet<Disposer> loaders = new HashSet<Disposer>();
+
+		private static DisposerManager instance = new DisposerManager();
+
+		public static DisposerManager Instance
+		{
+			get
+			{
+				return instance;
+			}
+		}
+
+		private DisposerManager()
+		{
+		}
+
+		public static void Reset()
+		{
+			instance.Dispose();
+			instance = new DisposerManager();
+		}
+
+		public void Dispose()
+		{
+			foreach (Disposer o in this.disposers.ToArray())
+			{
+				o.Dispose();
+			}
+		}
+
+		public void Register(string name, Assembly assembly)
+		{
+			this.assemblies[name] = assembly;
+
+			this.disposerEvents = new Dictionary<Type, IDisposerEvent>();
+			foreach (Assembly ass in this.assemblies.Values)
+			{
+				Type[] types = ass.GetTypes();
+				foreach (Type type in types)
+				{
+					object[] attrs = type.GetCustomAttributes(typeof(DisposerEventAttribute), false);
+
+					if (attrs.Length == 0)
+					{
+						continue;
+					}
+
+					object obj = Activator.CreateInstance(type);
+					IDisposerEvent disposerEvent = obj as IDisposerEvent;
+					if (disposerEvent == null)
+					{
+						Log.Error($"组件事件没有继承IComponentEvent: {type.Name}");
+					}
+					this.disposerEvents[disposerEvent.ValueType()] = disposerEvent;
+				}
+			}
+
+			this.Load();
+		}
+
+		public Assembly GetAssembly(string name)
+		{
+			return this.assemblies[name];
+		}
+
+		public Assembly[] GetAssemblies()
+		{
+			return this.assemblies.Values.ToArray();
+		}
+
+		private void Load()
+		{
+			foreach (Disposer disposer in this.loaders)
+			{
+				IDisposerEvent disposerEvent;
+				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+				{
+					continue;
+				}
+				ILoader iLoader = disposerEvent as ILoader;
+				if (iLoader == null)
+				{
+					continue;
+				}
+				disposerEvent.SetValue(disposer);
+				iLoader.Load();
+			}
+		}
+
+		public void Add(Disposer disposer)
+		{
+			if (this.disposerEvents == null)
+			{
+				return;
+			}
+
+			this.disposers.Add(disposer);
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+
+			IUpdate iUpdate = disposerEvent as IUpdate;
+			if (iUpdate != null)
+			{
+				this.updates.Add(disposer);
+			}
+
+			ILoader iLoader = disposerEvent as ILoader;
+			if (iLoader != null)
+			{
+				this.loaders.Add(disposer);
+			}
+		}
+
+		public void Remove(Disposer disposer)
+		{
+			this.disposers.Remove(disposer);
+
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+
+			IUpdate iUpdate = disposerEvent as IUpdate;
+			if (iUpdate != null)
+			{
+				this.updates.Remove(disposer);
+			}
+
+			ILoader iLoader = disposerEvent as ILoader;
+			if (iLoader != null)
+			{
+				this.loaders.Remove(disposer);
+			}
+		}
+
+		public void Awake(Disposer disposer)
+		{
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+			IAwake iAwake = disposerEvent as IAwake;
+			if (iAwake == null)
+			{
+				return;
+			}
+			disposerEvent.SetValue(disposer);
+			iAwake.Awake();
+		}
+
+		public void Awake<P1>(Disposer disposer, P1 p1)
+		{
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+			IAwake<P1> iAwake = disposerEvent as IAwake<P1>;
+			if (iAwake == null)
+			{
+				return;
+			}
+			disposerEvent.SetValue(disposer);
+			iAwake.Awake(p1);
+		}
+
+		public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
+		{
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+			IAwake<P1, P2> iAwake = disposerEvent as IAwake<P1, P2>;
+			if (iAwake == null)
+			{
+				return;
+			}
+			disposerEvent.SetValue(disposer);
+			iAwake.Awake(p1, p2);
+		}
+
+		public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
+		{
+			IDisposerEvent disposerEvent;
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+			{
+				return;
+			}
+			IAwake<P1, P2, P3> iAwake = disposerEvent as IAwake<P1, P2, P3>;
+			if (iAwake == null)
+			{
+				return;
+			}
+			disposerEvent.SetValue(disposer);
+			iAwake.Awake(p1, p2, p3);
+		}
+		
+		public void Update()
+		{
+			foreach (Disposer disposer in updates)
+			{
+				IDisposerEvent disposerEvent;
+				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out disposerEvent))
+				{
+					continue;
+				}
+				IUpdate iUpdate = disposerEvent as IUpdate;
+				if (iUpdate == null)
+				{
+					continue;
+				}
+				disposerEvent.SetValue(disposer);
+				try
+				{
+					iUpdate.Update();
+				}
+				catch (Exception e)
+				{
+					Log.Error(e.ToString());
+				}
+			}
+		}
+
+		public override string ToString()
+		{
+			var info = new Dictionary<string, int>();
+			foreach (Disposer obj in this.disposers)
+			{
+				if (info.ContainsKey(obj.GetType().Name))
+				{
+					info[obj.GetType().Name] += 1;
+				}
+				else
+				{
+					info[obj.GetType().Name] = 1;
+				}
+			}
+			info = info.OrderByDescending(s => s.Value).ToDictionary(p => p.Key, p => p.Value);
+			StringBuilder sb = new StringBuilder();
+			sb.Append("\r\n");
+			foreach (string key in info.Keys)
+			{
+				sb.Append($"{info[key],10} {key}\r\n");
+			}
+
+			sb.Append($"\r\n update: {this.updates.Count} total: {this.disposers.Count}");
+			return sb.ToString();
+		}
+	}
+}

+ 0 - 0
Unity/Assets/Scripts/Object/ObjectManager.cs.meta → Unity/Assets/Scripts/Object/DisposerManager.cs.meta


+ 7 - 10
Unity/Assets/Scripts/Object/Entity.cs

@@ -6,7 +6,7 @@ using MongoDB.Bson.Serialization.Attributes;
 
 namespace Model
 {
-	public class Entity: Object
+	public class Entity: Disposer
 	{
 		public EntityType Type { get; set; }
 
@@ -20,13 +20,12 @@ namespace Model
 		protected Entity(EntityType entityType)
 		{
 			this.Type = entityType;
-			ObjectManager.Instance.Add(this);
+			
 		}
 
 		protected Entity(long id, EntityType entityType) : base(id)
 		{
 			this.Type = entityType;
-			ObjectManager.Instance.Add(this);
 		}
 		
 		public override void Dispose()
@@ -49,8 +48,6 @@ namespace Model
 					Log.Error(e.ToString());
 				}
 			}
-
-			ObjectManager.Instance.Remove(this);
 		}
 
 		public K AddComponent<K>() where K : Component, new()
@@ -70,7 +67,7 @@ namespace Model
 
 			this.components.Add(component);
 			this.componentDict.Add(component.GetType(), component);
-			ObjectManager.Instance.Awake(component);
+			DisposerManager.Instance.Awake(component);
 			return component;
 		}
 
@@ -91,7 +88,7 @@ namespace Model
 
 			this.components.Add(component);
 			this.componentDict.Add(component.GetType(), component);
-			ObjectManager.Instance.Awake(component, p1);
+			DisposerManager.Instance.Awake(component, p1);
 			return component;
 		}
 
@@ -112,7 +109,7 @@ namespace Model
 
 			this.components.Add(component);
 			this.componentDict.Add(component.GetType(), component);
-			ObjectManager.Instance.Awake(component, p1, p2);
+			DisposerManager.Instance.Awake(component, p1, p2);
 			return component;
 		}
 
@@ -134,7 +131,7 @@ namespace Model
 
 			this.components.Add(component);
 			this.componentDict.Add(component.GetType(), component);
-			ObjectManager.Instance.Awake(component, p1, p2, p3);
+			DisposerManager.Instance.Awake(component, p1, p2, p3);
 			return component;
 		}
 
@@ -151,7 +148,7 @@ namespace Model
 			}
 			this.components.Add(component);
 			this.componentDict.Add(component.GetType(), component);
-			ObjectManager.Instance.Awake(component);
+			DisposerManager.Instance.Awake(component);
 		}
 
 		public void RemoveComponent<K>() where K : Component

+ 1 - 0
Unity/Assets/Scripts/Object/EntityType.cs

@@ -7,5 +7,6 @@
 		Session,
 		UI,
 		Config,
+		Unit,
 	}
 }

+ 10 - 5
Unity/Assets/Scripts/Object/Object.cs

@@ -5,11 +5,11 @@ using MongoDB.Bson.Serialization.Attributes;
 
 namespace Model
 {
-	public abstract class Object: IDisposable, ISupportInitialize, ICloneable
+	public abstract class Object: ISupportInitialize, ICloneable
 	{
 		[BsonId]
 		[BsonIgnoreIfDefault]
-		public long Id { get; private set; }
+		public long Id { get; protected set; }
 
 		protected Object()
 		{
@@ -30,18 +30,23 @@ namespace Model
 		}
 
 		public override string ToString()
+		{
+			return this.ToJson();
+		}
+
+		public string ToJson()
 		{
 			return MongoHelper.ToJson(this);
 		}
 
-		public virtual void Dispose()
+		public byte[] ToBson()
 		{
-			this.Id = 0;
+			return MongoHelper.ToBson(this);
 		}
 
 		public object Clone()
 		{
-			return MongoHelper.FromJson(this.GetType(), this.ToString());
+			return MongoHelper.FromBson(this.GetType(), this.ToBson());
 		}
 	}
 }

+ 0 - 299
Unity/Assets/Scripts/Object/ObjectManager.cs

@@ -1,299 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using Base;
-
-namespace Model
-{
-	public interface IObjectEvent
-	{
-		Type ValueType();
-		void SetValue(object value);
-	}
-
-	public abstract class ObjectEvent<T> : IObjectEvent
-	{
-		private T value;
-
-		protected T GetValue()
-		{
-			return value;
-		}
-
-		public void SetValue(object v)
-		{
-			this.value = (T)v;
-		}
-
-		public Type ValueType()
-		{
-			return typeof(T);
-		}
-	}
-
-	public sealed class ObjectManager : IDisposable
-	{
-		private readonly Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>();
-
-		private Dictionary<Type, IObjectEvent> objectEvents;
-
-		private readonly HashSet<Object> objects = new HashSet<Object>();
-		private readonly HashSet<Object> updates = new HashSet<Object>();
-		private readonly HashSet<Object> loaders = new HashSet<Object>();
-
-		private static ObjectManager instance = new ObjectManager();
-
-		public static ObjectManager Instance
-		{
-			get
-			{
-				return instance;
-			}
-		}
-
-		private ObjectManager()
-		{
-		}
-
-		public static void Reset()
-		{
-			instance.Dispose();
-			instance = new ObjectManager();
-		}
-
-		public void Dispose()
-		{
-			foreach (Object o in this.objects.ToArray())
-			{
-				o.Dispose();
-			}
-		}
-
-		public void Register(string name, Assembly assembly)
-		{
-			this.assemblies[name] = assembly;
-
-			objectEvents = new Dictionary<Type, IObjectEvent>();
-			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($"组件事件没有继承IComponentEvent: {type.Name}");
-					}
-					objectEvents[objectEvent.ValueType()] = objectEvent;
-				}
-			}
-
-			this.Load();
-		}
-
-		public Assembly GetAssembly(string name)
-		{
-			return this.assemblies[name];
-		}
-
-		public Assembly[] GetAssemblies()
-		{
-			return this.assemblies.Values.ToArray();
-		}
-
-		private void Load()
-		{
-			foreach (Object obj in this.loaders)
-			{
-				IObjectEvent objectEvent;
-				if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-				{
-					continue;
-				}
-				ILoader iLoader = objectEvent as ILoader;
-				if (iLoader == null)
-				{
-					continue;
-				}
-				objectEvent.SetValue(obj);
-				iLoader.Load();
-			}
-		}
-
-		public void Add(Object obj)
-		{
-			if (objectEvents == null)
-			{
-				return;
-			}
-
-			this.objects.Add(obj);
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-
-			IUpdate iUpdate = objectEvent as IUpdate;
-			if (iUpdate != null)
-			{
-				this.updates.Add(obj);
-			}
-
-			ILoader iLoader = objectEvent as ILoader;
-			if (iLoader != null)
-			{
-				this.loaders.Add(obj);
-			}
-		}
-
-		public void Remove(Object obj)
-		{
-			this.objects.Remove(obj);
-
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-
-			IUpdate iUpdate = objectEvent as IUpdate;
-			if (iUpdate != null)
-			{
-				this.updates.Remove(obj);
-			}
-
-			ILoader iLoader = objectEvent as ILoader;
-			if (iLoader != null)
-			{
-				this.loaders.Remove(obj);
-			}
-		}
-
-		public void Awake(Object obj)
-		{
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-			IAwake iAwake = objectEvent as IAwake;
-			if (iAwake == null)
-			{
-				return;
-			}
-			objectEvent.SetValue(obj);
-			iAwake.Awake();
-		}
-
-		public void Awake<P1>(Object obj, P1 p1)
-		{
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-			IAwake<P1> iAwake = objectEvent as IAwake<P1>;
-			if (iAwake == null)
-			{
-				return;
-			}
-			objectEvent.SetValue(obj);
-			iAwake.Awake(p1);
-		}
-
-		public void Awake<P1, P2>(Object obj, P1 p1, P2 p2)
-		{
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-			IAwake<P1, P2> iAwake = objectEvent as IAwake<P1, P2>;
-			if (iAwake == null)
-			{
-				return;
-			}
-			objectEvent.SetValue(obj);
-			iAwake.Awake(p1, p2);
-		}
-
-		public void Awake<P1, P2, P3>(Object obj, P1 p1, P2 p2, P3 p3)
-		{
-			IObjectEvent objectEvent;
-			if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-			{
-				return;
-			}
-			IAwake<P1, P2, P3> iAwake = objectEvent as IAwake<P1, P2, P3>;
-			if (iAwake == null)
-			{
-				return;
-			}
-			objectEvent.SetValue(obj);
-			iAwake.Awake(p1, p2, p3);
-		}
-		
-		public void Update()
-		{
-			foreach (Object obj in updates)
-			{
-				IObjectEvent objectEvent;
-				if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
-				{
-					continue;
-				}
-				IUpdate iUpdate = objectEvent as IUpdate;
-				if (iUpdate == null)
-				{
-					continue;
-				}
-				objectEvent.SetValue(obj);
-				try
-				{
-					iUpdate.Update();
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-				}
-			}
-		}
-
-		public override string ToString()
-		{
-			var info = new Dictionary<string, int>();
-			foreach (Object obj in objects)
-			{
-				if (info.ContainsKey(obj.GetType().Name))
-				{
-					info[obj.GetType().Name] += 1;
-				}
-				else
-				{
-					info[obj.GetType().Name] = 1;
-				}
-			}
-			info = info.OrderByDescending(s => s.Value).ToDictionary(p => p.Key, p => p.Value);
-			StringBuilder sb = new StringBuilder();
-			sb.Append("\r\n");
-			foreach (string key in info.Keys)
-			{
-				sb.Append($"{info[key],10} {key}\r\n");
-			}
-
-			sb.Append($"\r\n update: {this.updates.Count} total: {this.objects.Count}");
-			return sb.ToString();
-		}
-	}
-}

+ 0 - 8
Unity/Controller/Unity.Controller.csproj

@@ -59,14 +59,6 @@
     <Compile Include="UI\UILogin\Factory\UILoginFactory.cs" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\Unity.CSharp.csproj">
-      <Project>{4123f183-8f61-27ae-ea27-294dde0cc7eb}</Project>
-      <Name>Unity.CSharp</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\Unity.CSharp.Plugins.csproj">
-      <Project>{1aa60596-6964-87f6-2427-6ca85bbaf27d}</Project>
-      <Name>Unity.CSharp.Plugins</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Unity.csproj">
       <Project>{cf118143-7e37-744f-be45-3f55345fec40}</Project>
       <Name>Unity</Name>

BIN
Unity/ProjectSettings/EditorSettings.asset


+ 8 - 4
Unity/Unity.csproj

@@ -13,11 +13,13 @@
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <TargetFrameworkProfile>Unity Full v3.5</TargetFrameworkProfile>
-    <CompilerResponseFile></CompilerResponseFile>
+    <CompilerResponseFile>
+    </CompilerResponseFile>
     <UnityProjectType>Game:1</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows:5</UnityBuildTarget>
     <UnityVersion>5.4.1f1</UnityVersion>
-    <RootNamespace></RootNamespace>
+    <RootNamespace>
+    </RootNamespace>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -109,6 +111,7 @@
     <Compile Include="Assets\Scripts\Entity\Message\Message.cs" />
     <Compile Include="Assets\Scripts\Entity\Scene.cs" />
     <Compile Include="Assets\Scripts\Entity\Session.cs" />
+    <Compile Include="Assets\Scripts\Entity\Unit.cs" />
     <Compile Include="Assets\Scripts\Entity\UI.cs" />
     <Compile Include="Assets\Scripts\Event\AEventAttribute.cs" />
     <Compile Include="Assets\Scripts\Event\Env.cs" />
@@ -135,9 +138,10 @@
     <Compile Include="Assets\Scripts\Object\IAwake.cs" />
     <Compile Include="Assets\Scripts\Object\ILoader.cs" />
     <Compile Include="Assets\Scripts\Object\IUpdate.cs" />
+    <Compile Include="Assets\Scripts\Object\Disposer.cs" />
     <Compile Include="Assets\Scripts\Object\Object.cs" />
-    <Compile Include="Assets\Scripts\Object\ObjectEventAttribute.cs" />
-    <Compile Include="Assets\Scripts\Object\ObjectManager.cs" />
+    <Compile Include="Assets\Scripts\Object\DisposerEventAttribute.cs" />
+    <Compile Include="Assets\Scripts\Object\DisposerManager.cs" />
     <Compile Include="Assets\Scripts\Other\Define.cs" />
     <Compile Include="Assets\Scripts\Other\GameException.cs" />
     <Compile Include="Assets\Scripts\Other\IUIFactory.cs" />