From dd13e1002e69b209b5d138f283a8661581b6e936 Mon Sep 17 00:00:00 2001 From: tanghai Date: Mon, 29 Oct 2018 17:12:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DeserializeSystem=EF=BC=8CCom?= =?UTF-8?q?ponent=E5=9C=A8=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E5=90=8E?= =?UTF-8?q?=E4=BC=9A=E8=A7=A6=E5=8F=91=E8=AF=A5System=E3=80=82=E4=B8=8D?= =?UTF-8?q?=E8=BF=87=E8=A6=81=E5=B0=8F=E5=BF=83=E4=BD=BF=E7=94=A8=EF=BC=8C?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=81=87=E5=A6=82=E8=BF=99=E4=B8=AAComponent?= =?UTF-8?q?=E4=BC=9A=E4=BF=9D=E5=AD=98=E5=88=B0DB=EF=BC=8C=E9=82=A3?= =?UTF-8?q?=E4=B9=88=E4=BC=A0=E5=88=B0dbserver=E4=B9=9F=E4=BC=9A=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E8=BF=99=E4=B8=AASystem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Model/Module/Demo/Unit.cs | 7 +- Server/Model/Server.Model.csproj | 4 +- Unity/Assets/Hotfix/Base/Object/Component.cs | 9 +- Unity/Assets/Hotfix/Base/Object/Entity.cs | 20 ---- .../Assets/Hotfix/Base/Object/EventSystem.cs | 94 +++++++++++-------- .../Hotfix/Base/Object/IComponentSerialize.cs | 13 --- .../Hotfix/Base/Object/IDeserializeSystem.cs | 25 +++++ ...ize.cs.meta => IDeserializeSystem.cs.meta} | 2 +- Unity/Assets/Model/Base/Object/Component.cs | 9 +- Unity/Assets/Model/Base/Object/Entity.cs | 20 ---- Unity/Assets/Model/Base/Object/EventSystem.cs | 94 +++++++++++-------- .../Model/Base/Object/IComponentSerialize.cs | 13 --- .../Model/Base/Object/IDeserializeSystem.cs | 30 ++++++ ...ize.cs.meta => IDeserializeSystem.cs.meta} | 5 +- Unity/Unity.Hotfix.csproj | 2 +- Unity/Unity.Model.csproj | 2 +- Unity/Unity.sln | 12 +-- 17 files changed, 184 insertions(+), 177 deletions(-) delete mode 100644 Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs create mode 100644 Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs rename Unity/Assets/Hotfix/Base/Object/{IComponentSerialize.cs.meta => IDeserializeSystem.cs.meta} (83%) delete mode 100644 Unity/Assets/Model/Base/Object/IComponentSerialize.cs create mode 100644 Unity/Assets/Model/Base/Object/IDeserializeSystem.cs rename Unity/Assets/Model/Base/Object/{IComponentSerialize.cs.meta => IDeserializeSystem.cs.meta} (69%) diff --git a/Server/Model/Module/Demo/Unit.cs b/Server/Model/Module/Demo/Unit.cs index d658131f..5b96d600 100644 --- a/Server/Model/Module/Demo/Unit.cs +++ b/Server/Model/Module/Demo/Unit.cs @@ -10,7 +10,7 @@ namespace ETModel } [ObjectSystem] - public class UnitSystem : AwakeSystem + public class UnitAwakeSystem : AwakeSystem { public override void Awake(Unit self, UnitType a) { @@ -30,11 +30,6 @@ namespace ETModel this.UnitType = unitType; } - public override void EndDeSerialize() - { - Game.EventSystem.Add(this); - } - public override void Dispose() { if (this.IsDisposed) diff --git a/Server/Model/Server.Model.csproj b/Server/Model/Server.Model.csproj index 05d0912e..781b0b6a 100644 --- a/Server/Model/Server.Model.csproj +++ b/Server/Model/Server.Model.csproj @@ -44,6 +44,9 @@ Base\Async\MoveNextRunner.cs + + Base\Base\IDeserializeSystem.cs + Base\UnityMath\Color32.cs @@ -131,7 +134,6 @@ - diff --git a/Unity/Assets/Hotfix/Base/Object/Component.cs b/Unity/Assets/Hotfix/Base/Object/Component.cs index 32616d89..9feefc86 100644 --- a/Unity/Assets/Hotfix/Base/Object/Component.cs +++ b/Unity/Assets/Hotfix/Base/Object/Component.cs @@ -4,7 +4,7 @@ using MongoDB.Bson.Serialization.Attributes; namespace ETHotfix { [BsonIgnoreExtraElements] - public abstract class Component : Object, IDisposable, IComponentSerialize + public abstract class Component : Object, IDisposable { [BsonIgnore] public long InstanceId { get; protected set; } @@ -84,12 +84,9 @@ namespace ETHotfix } } - public virtual void BeginSerialize() - { - } - - public virtual void EndDeSerialize() + public override void EndInit() { + Game.EventSystem.Deserialize(this); } } } \ No newline at end of file diff --git a/Unity/Assets/Hotfix/Base/Object/Entity.cs b/Unity/Assets/Hotfix/Base/Object/Entity.cs index 64d7c831..5069133e 100644 --- a/Unity/Assets/Hotfix/Base/Object/Entity.cs +++ b/Unity/Assets/Hotfix/Base/Object/Entity.cs @@ -243,25 +243,5 @@ namespace ETHotfix Log.Error(e); } } - - public override void BeginSerialize() - { - base.BeginSerialize(); - - foreach (Component component in this.components) - { - component.BeginSerialize(); - } - } - - public override void EndDeSerialize() - { - base.EndDeSerialize(); - - foreach (Component component in this.components) - { - component.EndDeSerialize(); - } - } } } \ No newline at end of file diff --git a/Unity/Assets/Hotfix/Base/Object/EventSystem.cs b/Unity/Assets/Hotfix/Base/Object/EventSystem.cs index 6efc5406..f082a14a 100644 --- a/Unity/Assets/Hotfix/Base/Object/EventSystem.cs +++ b/Unity/Assets/Hotfix/Base/Object/EventSystem.cs @@ -25,6 +25,8 @@ namespace ETHotfix private readonly UnOrderMultiMap lateUpdateSystems = new UnOrderMultiMap(); private readonly UnOrderMultiMap changeSystems = new UnOrderMultiMap(); + + private readonly UnOrderMultiMap deserializeSystems = new UnOrderMultiMap(); private Queue updates = new Queue(); private Queue updates2 = new Queue(); @@ -65,46 +67,32 @@ namespace ETHotfix object obj = Activator.CreateInstance(type); - IAwakeSystem objectSystem = obj as IAwakeSystem; - if (objectSystem != null) - { - this.awakeSystems.Add(objectSystem.Type(), objectSystem); - } - - IUpdateSystem updateSystem = obj as IUpdateSystem; - if (updateSystem != null) - { - this.updateSystems.Add(updateSystem.Type(), updateSystem); - } - - ILateUpdateSystem lateUpdateSystem = obj as ILateUpdateSystem; - if (lateUpdateSystem != null) - { - this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem); - } - - IStartSystem startSystem = obj as IStartSystem; - if (startSystem != null) - { - this.startSystems.Add(startSystem.Type(), startSystem); - } - - IDestroySystem destroySystem = obj as IDestroySystem; - if (destroySystem != null) - { - this.destroySystems.Add(destroySystem.Type(), destroySystem); - } - - ILoadSystem loadSystem = obj as ILoadSystem; - if (loadSystem != null) - { - this.loadSystems.Add(loadSystem.Type(), loadSystem); - } - - IChangeSystem changeSystem = obj as IChangeSystem; - if (changeSystem != null) - { - this.changeSystems.Add(changeSystem.Type(), changeSystem); + switch (obj) + { + case IAwakeSystem objectSystem: + this.awakeSystems.Add(objectSystem.Type(), objectSystem); + break; + case IUpdateSystem updateSystem: + this.updateSystems.Add(updateSystem.Type(), updateSystem); + break; + case ILateUpdateSystem lateUpdateSystem: + this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem); + break; + case IStartSystem startSystem: + this.startSystems.Add(startSystem.Type(), startSystem); + break; + case IDestroySystem destroySystem: + this.destroySystems.Add(destroySystem.Type(), destroySystem); + break; + case ILoadSystem loadSystem: + this.loadSystems.Add(loadSystem.Type(), loadSystem); + break; + case IChangeSystem changeSystem: + this.changeSystems.Add(changeSystem.Type(), changeSystem); + break; + case IDeserializeSystem deserializeSystem: + this.deserializeSystems.Add(deserializeSystem.Type(), deserializeSystem); + break; } } @@ -197,6 +185,32 @@ namespace ETHotfix { this.allComponents.Remove(instanceId); } + + public void Deserialize(Component component) + { + List iDeserializeSystems = this.deserializeSystems[component.GetType()]; + if (iDeserializeSystems == null) + { + return; + } + + foreach (IDeserializeSystem deserializeSystem in iDeserializeSystems) + { + if (deserializeSystem == null) + { + continue; + } + + try + { + deserializeSystem.Run(component); + } + catch (Exception e) + { + Log.Error(e); + } + } + } public void Awake(Component component) { diff --git a/Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs b/Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs deleted file mode 100644 index a9599743..00000000 --- a/Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ETHotfix -{ - // 在序列化前或者反序列化之后需要做一些操作,可以实现该接口,该接口的方法需要手动调用 - // 相比ISupportInitialize接口,BeginSerialize在BeginInit之前调用,EndDeSerialize在EndInit之后调用 - // 并且需要手动调用,可以在反序列化之后,在次方法中将注册组件到EventSystem之中等等 - public interface IComponentSerialize - { - // 序列化之前调用 - void BeginSerialize(); - // 反序列化之后调用 - void EndDeSerialize(); - } -} \ No newline at end of file diff --git a/Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs b/Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs new file mode 100644 index 00000000..8aca9428 --- /dev/null +++ b/Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs @@ -0,0 +1,25 @@ +using System; + +namespace ETHotfix +{ + public interface IDeserializeSystem + { + Type Type(); + void Run(object o); + } + + public abstract class DeserializeSystem : IDeserializeSystem + { + public void Run(object o) + { + this.Deserialize((T)o); + } + + public Type Type() + { + return typeof(T); + } + + public abstract void Deserialize(T self); + } +} diff --git a/Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs.meta b/Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs.meta similarity index 83% rename from Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs.meta rename to Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs.meta index d647d383..426de1eb 100644 --- a/Unity/Assets/Hotfix/Base/Object/IComponentSerialize.cs.meta +++ b/Unity/Assets/Hotfix/Base/Object/IDeserializeSystem.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f4c02bef60f3a024eb86be6cbe51eefe +guid: f3e96494042eb2445b639892a5a761af MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Unity/Assets/Model/Base/Object/Component.cs b/Unity/Assets/Model/Base/Object/Component.cs index 205c808b..497cc5fe 100644 --- a/Unity/Assets/Model/Base/Object/Component.cs +++ b/Unity/Assets/Model/Base/Object/Component.cs @@ -4,7 +4,7 @@ using MongoDB.Bson.Serialization.Attributes; namespace ETModel { [BsonIgnoreExtraElements] - public abstract class Component : Object, IDisposable, IComponentSerialize + public abstract class Component : Object, IDisposable { [BsonIgnore] public long InstanceId { get; private set; } @@ -84,12 +84,9 @@ namespace ETModel } } - public virtual void BeginSerialize() - { - } - - public virtual void EndDeSerialize() + public override void EndInit() { + Game.EventSystem.Deserialize(this); } } } \ No newline at end of file diff --git a/Unity/Assets/Model/Base/Object/Entity.cs b/Unity/Assets/Model/Base/Object/Entity.cs index 197d0d0a..5b222232 100644 --- a/Unity/Assets/Model/Base/Object/Entity.cs +++ b/Unity/Assets/Model/Base/Object/Entity.cs @@ -243,25 +243,5 @@ namespace ETModel Log.Error(e); } } - - public override void BeginSerialize() - { - base.BeginSerialize(); - - foreach (Component component in this.components) - { - component.BeginSerialize(); - } - } - - public override void EndDeSerialize() - { - base.EndDeSerialize(); - - foreach (Component component in this.components) - { - component.EndDeSerialize(); - } - } } } \ No newline at end of file diff --git a/Unity/Assets/Model/Base/Object/EventSystem.cs b/Unity/Assets/Model/Base/Object/EventSystem.cs index dfef626e..28d05eee 100644 --- a/Unity/Assets/Model/Base/Object/EventSystem.cs +++ b/Unity/Assets/Model/Base/Object/EventSystem.cs @@ -33,6 +33,8 @@ namespace ETModel private readonly UnOrderMultiMap lateUpdateSystems = new UnOrderMultiMap(); private readonly UnOrderMultiMap changeSystems = new UnOrderMultiMap(); + + private readonly UnOrderMultiMap deserializeSystems = new UnOrderMultiMap(); private Queue updates = new Queue(); private Queue updates2 = new Queue(); @@ -82,46 +84,32 @@ namespace ETModel object obj = Activator.CreateInstance(type); - IAwakeSystem objectSystem = obj as IAwakeSystem; - if (objectSystem != null) - { - this.awakeSystems.Add(objectSystem.Type(), objectSystem); - } - - IUpdateSystem updateSystem = obj as IUpdateSystem; - if (updateSystem != null) - { - this.updateSystems.Add(updateSystem.Type(), updateSystem); - } - - ILateUpdateSystem lateUpdateSystem = obj as ILateUpdateSystem; - if (lateUpdateSystem != null) - { - this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem); - } - - IStartSystem startSystem = obj as IStartSystem; - if (startSystem != null) - { - this.startSystems.Add(startSystem.Type(), startSystem); - } - - IDestroySystem destroySystem = obj as IDestroySystem; - if (destroySystem != null) - { - this.destroySystems.Add(destroySystem.Type(), destroySystem); - } - - ILoadSystem loadSystem = obj as ILoadSystem; - if (loadSystem != null) - { - this.loadSystems.Add(loadSystem.Type(), loadSystem); - } - - IChangeSystem changeSystem = obj as IChangeSystem; - if (changeSystem != null) - { - this.changeSystems.Add(changeSystem.Type(), changeSystem); + switch (obj) + { + case IAwakeSystem objectSystem: + this.awakeSystems.Add(objectSystem.Type(), objectSystem); + break; + case IUpdateSystem updateSystem: + this.updateSystems.Add(updateSystem.Type(), updateSystem); + break; + case ILateUpdateSystem lateUpdateSystem: + this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem); + break; + case IStartSystem startSystem: + this.startSystems.Add(startSystem.Type(), startSystem); + break; + case IDestroySystem destroySystem: + this.destroySystems.Add(destroySystem.Type(), destroySystem); + break; + case ILoadSystem loadSystem: + this.loadSystems.Add(loadSystem.Type(), loadSystem); + break; + case IChangeSystem changeSystem: + this.changeSystems.Add(changeSystem.Type(), changeSystem); + break; + case IDeserializeSystem deserializeSystem: + this.deserializeSystems.Add(deserializeSystem.Type(), deserializeSystem); + break; } } @@ -207,6 +195,32 @@ namespace ETModel this.allComponents.TryGetValue(id, out component); return component; } + + public void Deserialize(Component component) + { + List iDeserializeSystems = this.deserializeSystems[component.GetType()]; + if (iDeserializeSystems == null) + { + return; + } + + foreach (IDeserializeSystem deserializeSystem in iDeserializeSystems) + { + if (deserializeSystem == null) + { + continue; + } + + try + { + deserializeSystem.Run(component); + } + catch (Exception e) + { + Log.Error(e); + } + } + } public void Awake(Component component) { diff --git a/Unity/Assets/Model/Base/Object/IComponentSerialize.cs b/Unity/Assets/Model/Base/Object/IComponentSerialize.cs deleted file mode 100644 index 84d98f7c..00000000 --- a/Unity/Assets/Model/Base/Object/IComponentSerialize.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ETModel -{ - // 在序列化前或者反序列化之后需要做一些操作,可以实现该接口,该接口的方法需要手动调用 - // 相比ISupportInitialize接口,BeginSerialize在BeginInit之前调用,EndDeSerialize在EndInit之后调用 - // 并且需要手动调用,可以在反序列化之后,在次方法中将注册组件到EventSystem之中等等 - public interface IComponentSerialize - { - // 序列化之前调用 - void BeginSerialize(); - // 反序列化之后调用 - void EndDeSerialize(); - } -} \ No newline at end of file diff --git a/Unity/Assets/Model/Base/Object/IDeserializeSystem.cs b/Unity/Assets/Model/Base/Object/IDeserializeSystem.cs new file mode 100644 index 00000000..a11ee62f --- /dev/null +++ b/Unity/Assets/Model/Base/Object/IDeserializeSystem.cs @@ -0,0 +1,30 @@ +using System; + +namespace ETModel +{ + public interface IDeserializeSystem + { + Type Type(); + void Run(object o); + } + + /// + /// 反序列化后执行的System + /// 要小心使用这个System,因为对象假如要保存到数据库,到dbserver也会进行反序列化,那么也会执行该System + /// + /// + public abstract class DeserializeSystem : IDeserializeSystem + { + public void Run(object o) + { + this.Deserialize((T)o); + } + + public Type Type() + { + return typeof(T); + } + + public abstract void Deserialize(T self); + } +} diff --git a/Unity/Assets/Model/Base/Object/IComponentSerialize.cs.meta b/Unity/Assets/Model/Base/Object/IDeserializeSystem.cs.meta similarity index 69% rename from Unity/Assets/Model/Base/Object/IComponentSerialize.cs.meta rename to Unity/Assets/Model/Base/Object/IDeserializeSystem.cs.meta index 06b8738e..ab516923 100644 --- a/Unity/Assets/Model/Base/Object/IComponentSerialize.cs.meta +++ b/Unity/Assets/Model/Base/Object/IDeserializeSystem.cs.meta @@ -1,8 +1,7 @@ fileFormatVersion: 2 -guid: 1d4dd4af4f735fc43a9893df26ab0bce -timeCreated: 1526888904 -licenseType: Pro +guid: 5e19578888c954c48ae3e6d6cd5a3ceb MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Unity/Unity.Hotfix.csproj b/Unity/Unity.Hotfix.csproj index fb5068d1..e6a850ab 100644 --- a/Unity/Unity.Hotfix.csproj +++ b/Unity/Unity.Hotfix.csproj @@ -70,7 +70,7 @@ - + diff --git a/Unity/Unity.Model.csproj b/Unity/Unity.Model.csproj index b287093b..7bc736e8 100644 --- a/Unity/Unity.Model.csproj +++ b/Unity/Unity.Model.csproj @@ -101,7 +101,7 @@ - + diff --git a/Unity/Unity.sln b/Unity/Unity.sln index 8a9d5c5e..692fdca9 100644 --- a/Unity/Unity.sln +++ b/Unity/Unity.sln @@ -4,10 +4,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Model", "Unity.Model. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.ThirdParty", "Unity.ThirdParty.csproj", "{E15BADD2-3A26-309A-AB0F-DC5B08044350}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Editor", "Unity.Editor.csproj", "{CD311104-1830-B119-81B6-5DBEE2467FFB}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Hotfix", "Unity.Hotfix.csproj", "{1066F652-6A89-D1C4-9881-1A19DF7AB80E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unity.Editor", "Unity.Editor.csproj", "{CD311104-1830-B119-81B6-5DBEE2467FFB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -22,14 +22,14 @@ Global {E15BADD2-3A26-309A-AB0F-DC5B08044350}.Debug|Any CPU.Build.0 = Debug|Any CPU {E15BADD2-3A26-309A-AB0F-DC5B08044350}.Release|Any CPU.ActiveCfg = Release|Any CPU {E15BADD2-3A26-309A-AB0F-DC5B08044350}.Release|Any CPU.Build.0 = Release|Any CPU - {CD311104-1830-B119-81B6-5DBEE2467FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CD311104-1830-B119-81B6-5DBEE2467FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CD311104-1830-B119-81B6-5DBEE2467FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CD311104-1830-B119-81B6-5DBEE2467FFB}.Release|Any CPU.Build.0 = Release|Any CPU {1066F652-6A89-D1C4-9881-1A19DF7AB80E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1066F652-6A89-D1C4-9881-1A19DF7AB80E}.Debug|Any CPU.Build.0 = Debug|Any CPU {1066F652-6A89-D1C4-9881-1A19DF7AB80E}.Release|Any CPU.ActiveCfg = Release|Any CPU {1066F652-6A89-D1C4-9881-1A19DF7AB80E}.Release|Any CPU.Build.0 = Release|Any CPU + {CD311104-1830-B119-81B6-5DBEE2467FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD311104-1830-B119-81B6-5DBEE2467FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD311104-1830-B119-81B6-5DBEE2467FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD311104-1830-B119-81B6-5DBEE2467FFB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- GitLab