From a883cffe0ca24235baa4c5e090bae8b0da5a9456 Mon Sep 17 00:00:00 2001 From: tanghai Date: Tue, 27 Nov 2018 20:01:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=B9=E8=B1=A1=E6=B1=A0?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=EF=BC=8C=E5=A6=82=E6=9E=9CEntity=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BD=BF=E7=94=A8=E5=AF=B9=E8=B1=A1=E6=B1=A0=EF=BC=8C?= =?UTF-8?q?=E9=82=A3=E4=B9=88=E6=8C=82=E8=BD=BD=E7=BB=84=E4=BB=B6=E4=B9=9F?= =?UTF-8?q?=E4=B8=8D=E4=BD=BF=E7=94=A8=E5=AF=B9=E8=B1=A1=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Unity/Assets/Hotfix/Base/Object/Entity.cs | 10 ++--- Unity/Assets/Hotfix/Base/Object/ObjectPool.cs | 3 +- Unity/Assets/Hotfix/Entity/Game.cs | 33 +++++++++------ Unity/Assets/Model/Base/Object/Entity.cs | 10 ++--- Unity/Assets/Model/Base/Object/ObjectPool.cs | 3 +- .../Model/Component/SceneChangeComponent.cs | 7 ++- Unity/Assets/Model/Entity/Game.cs | 40 ++++++++++++------ Unity/Assets/Model/Module/Message/Session.cs | 5 +-- Unity/Assets/Res/Code/Hotfix.mdb.bytes | Bin 12961 -> 0 bytes 9 files changed, 66 insertions(+), 45 deletions(-) delete mode 100644 Unity/Assets/Res/Code/Hotfix.mdb.bytes diff --git a/Unity/Assets/Hotfix/Base/Object/Entity.cs b/Unity/Assets/Hotfix/Base/Object/Entity.cs index 1d384979..92d2a610 100644 --- a/Unity/Assets/Hotfix/Base/Object/Entity.cs +++ b/Unity/Assets/Hotfix/Base/Object/Entity.cs @@ -69,7 +69,7 @@ namespace ETHotfix throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {type.Name}"); } - Component component = ComponentFactory.CreateWithParent(type, this); + Component component = ComponentFactory.CreateWithParent(type, this, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -83,7 +83,7 @@ namespace ETHotfix throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this); + K component = ComponentFactory.CreateWithParent(this, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -97,7 +97,7 @@ namespace ETHotfix throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1); + K component = ComponentFactory.CreateWithParent(this, p1, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -111,7 +111,7 @@ namespace ETHotfix throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1, p2); + K component = ComponentFactory.CreateWithParent(this, p1, p2, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -125,7 +125,7 @@ namespace ETHotfix throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1, p2, p3); + K component = ComponentFactory.CreateWithParent(this, p1, p2, p3, this.IsFromPool); this.componentDict.Add(type, component); return component; diff --git a/Unity/Assets/Hotfix/Base/Object/ObjectPool.cs b/Unity/Assets/Hotfix/Base/Object/ObjectPool.cs index 1c94140b..d7b6378a 100644 --- a/Unity/Assets/Hotfix/Base/Object/ObjectPool.cs +++ b/Unity/Assets/Hotfix/Base/Object/ObjectPool.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace ETHotfix { - public class ObjectPool + public class ObjectPool: Component { private readonly Dictionary> dictionary = new Dictionary>(); @@ -36,6 +36,7 @@ namespace ETHotfix public void Recycle(Component obj) { + obj.Parent = this; Type type = obj.GetType(); Queue queue; if (!this.dictionary.TryGetValue(type, out queue)) diff --git a/Unity/Assets/Hotfix/Entity/Game.cs b/Unity/Assets/Hotfix/Entity/Game.cs index 17dc3754..3effbe2d 100644 --- a/Unity/Assets/Hotfix/Entity/Game.cs +++ b/Unity/Assets/Hotfix/Entity/Game.cs @@ -1,7 +1,19 @@ -namespace ETHotfix +using UnityEngine; + +namespace ETHotfix { public static class Game { + private static EventSystem eventSystem; + + public static EventSystem EventSystem + { + get + { + return eventSystem ?? (eventSystem = new EventSystem()); + } + } + private static Scene scene; public static Scene Scene @@ -18,23 +30,19 @@ } } - private static EventSystem eventSystem; - - public static EventSystem EventSystem - { - get - { - return eventSystem ?? (eventSystem = new EventSystem()); - } - } - private static ObjectPool objectPool; public static ObjectPool ObjectPool { get { - return objectPool ?? (objectPool = new ObjectPool()); + if (objectPool != null) + { + return objectPool; + } + objectPool = new ObjectPool(); + objectPool.GameObject.transform.SetParent(GameObject.Find("/Global").transform); + return objectPool; } } @@ -43,6 +51,7 @@ scene.Dispose(); scene = null; eventSystem = null; + objectPool.Dispose(); objectPool = null; } } diff --git a/Unity/Assets/Model/Base/Object/Entity.cs b/Unity/Assets/Model/Base/Object/Entity.cs index c5d653b8..b49479e7 100644 --- a/Unity/Assets/Model/Base/Object/Entity.cs +++ b/Unity/Assets/Model/Base/Object/Entity.cs @@ -69,7 +69,7 @@ namespace ETModel throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {type.Name}"); } - Component component = ComponentFactory.CreateWithParent(type, this); + Component component = ComponentFactory.CreateWithParent(type, this, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -83,7 +83,7 @@ namespace ETModel throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this); + K component = ComponentFactory.CreateWithParent(this, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -97,7 +97,7 @@ namespace ETModel throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1); + K component = ComponentFactory.CreateWithParent(this, p1, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -111,7 +111,7 @@ namespace ETModel throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1, p2); + K component = ComponentFactory.CreateWithParent(this, p1, p2, this.IsFromPool); this.componentDict.Add(type, component); return component; @@ -125,7 +125,7 @@ namespace ETModel throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof(K).Name}"); } - K component = ComponentFactory.CreateWithParent(this, p1, p2, p3); + K component = ComponentFactory.CreateWithParent(this, p1, p2, p3, this.IsFromPool); this.componentDict.Add(type, component); return component; diff --git a/Unity/Assets/Model/Base/Object/ObjectPool.cs b/Unity/Assets/Model/Base/Object/ObjectPool.cs index a94012e1..71a5755a 100644 --- a/Unity/Assets/Model/Base/Object/ObjectPool.cs +++ b/Unity/Assets/Model/Base/Object/ObjectPool.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace ETModel { - public class ObjectPool + public class ObjectPool: Component { private readonly Dictionary> dictionary = new Dictionary>(); @@ -36,6 +36,7 @@ namespace ETModel public void Recycle(Component obj) { + obj.Parent = this; Type type = obj.GetType(); Queue queue; if (!this.dictionary.TryGetValue(type, out queue)) diff --git a/Unity/Assets/Model/Component/SceneChangeComponent.cs b/Unity/Assets/Model/Component/SceneChangeComponent.cs index 0545fd6f..ed1a9cde 100644 --- a/Unity/Assets/Model/Component/SceneChangeComponent.cs +++ b/Unity/Assets/Model/Component/SceneChangeComponent.cs @@ -53,14 +53,13 @@ namespace ETModel { return; } - base.Dispose(); if (this.Entity.IsDisposed) { - return; + this.Entity.RemoveComponent(); } - - this.Entity.RemoveComponent(); + + base.Dispose(); } } } \ No newline at end of file diff --git a/Unity/Assets/Model/Entity/Game.cs b/Unity/Assets/Model/Entity/Game.cs index 07153f2c..f35a2b9a 100644 --- a/Unity/Assets/Model/Entity/Game.cs +++ b/Unity/Assets/Model/Entity/Game.cs @@ -1,7 +1,19 @@ -namespace ETModel +using UnityEngine; + +namespace ETModel { public static class Game { + private static EventSystem eventSystem; + + public static EventSystem EventSystem + { + get + { + return eventSystem ?? (eventSystem = new EventSystem()); + } + } + private static Scene scene; public static Scene Scene @@ -13,28 +25,24 @@ return scene; } scene = new Scene(); - scene.GameObject.transform.SetParent(scene.GameObject.transform.Find("/Global")); + scene.GameObject.transform.SetParent(GameObject.Find("/Global").transform); return scene; } } - private static EventSystem eventSystem; - - public static EventSystem EventSystem - { - get - { - return eventSystem ?? (eventSystem = new EventSystem()); - } - } - private static ObjectPool objectPool; public static ObjectPool ObjectPool { get { - return objectPool ?? (objectPool = new ObjectPool()); + if (objectPool != null) + { + return objectPool; + } + objectPool = new ObjectPool(); + objectPool.GameObject.transform.SetParent(GameObject.Find("/Global").transform); + return objectPool; } } @@ -50,10 +58,14 @@ public static void Close() { - scene.Dispose(); eventSystem = null; + + scene.Dispose(); scene = null; + + objectPool.Dispose(); objectPool = null; + hotfix = null; } } diff --git a/Unity/Assets/Model/Module/Message/Session.cs b/Unity/Assets/Model/Module/Message/Session.cs index ba739e3e..f0dffe58 100644 --- a/Unity/Assets/Model/Module/Message/Session.cs +++ b/Unity/Assets/Model/Module/Message/Session.cs @@ -64,8 +64,8 @@ namespace ETModel return; } - long id = this.Id; - + this.Network.Remove(this.Id); + base.Dispose(); foreach (Action action in this.requestCallback.Values.ToArray()) @@ -80,7 +80,6 @@ namespace ETModel //} this.channel.Dispose(); - this.Network.Remove(id); this.requestCallback.Clear(); } diff --git a/Unity/Assets/Res/Code/Hotfix.mdb.bytes b/Unity/Assets/Res/Code/Hotfix.mdb.bytes deleted file mode 100644 index 36614963dc1c24792c4a654a57158373f40f7084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12961 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 EA5lDg)&Kwi -- GitLab