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

1.GetComponentSystem有巨大作用,比如每次保存Unit的数据不需要所有组件都保存,只需要保存Unit变化过的组件
是否变化可以通过判断该组件是否GetComponent,Get了就记录该组件
这样可以只保存Unit变化过的组件。传送也可以做此类优化
2.增加AddComponentSystem跟GetComponentSystem作用类似
3.修复关闭游戏抛的异常

tanghai 4 лет назад
Родитель
Сommit
c5b88ecd54

+ 1 - 1
Unity/Codes/Hotfix/Demo/Move/MoveComponentSystem.cs

@@ -290,7 +290,7 @@ namespace ET
             self.StartPos = Vector3.zero;
             self.BeginTime = 0;
             self.NeedTime = 0;
-            TimerComponent.Instance.Remove(ref self.MoveTimer);
+            TimerComponent.Instance?.Remove(ref self.MoveTimer);
             self.Targets.Clear();
             self.Speed = 0;
             self.N = 0;

+ 1 - 1
Unity/Codes/Hotfix/Module/AI/AIComponentSystem.cs

@@ -34,7 +34,7 @@ namespace ET
     {
         public override void Destroy(AIComponent self)
         {
-            TimerComponent.Instance.Remove(ref self.Timer);
+            TimerComponent.Instance?.Remove(ref self.Timer);
             self.CancellationToken?.Cancel();
             self.CancellationToken = null;
             self.Current = 0;

+ 1 - 1
Unity/Codes/Hotfix/Module/Message/SessionIdleCheckerComponentSystem.cs

@@ -32,7 +32,7 @@ namespace ET
     {
         public override void Destroy(SessionIdleCheckerComponent self)
         {
-            TimerComponent.Instance.Remove(ref self.RepeatedTimer);
+            TimerComponent.Instance?.Remove(ref self.RepeatedTimer);
         }
     }
 

+ 34 - 4
Unity/Codes/Model/Core/Object/Entity.cs

@@ -659,9 +659,9 @@ namespace ET
             }
 
             // 如果有IGetComponent接口,则触发GetComponentSystem
-            if (component is IGetComponent)
+            if (this is IGetComponent)
             {
-                EventSystem.Instance.GetComponent(component);
+                EventSystem.Instance.GetComponent(this, component);
             }
 
             return (K) component;
@@ -681,9 +681,9 @@ namespace ET
             }
             
             // 如果有IGetComponent接口,则触发GetComponentSystem
-            if (component is IGetComponent)
+            if (this is IGetComponent)
             {
-                EventSystem.Instance.GetComponent(component);
+                EventSystem.Instance.GetComponent(this, component);
             }
 
             return component;
@@ -716,6 +716,11 @@ namespace ET
             }
 
             component.ComponentParent = this;
+
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component;
         }
 
@@ -730,6 +735,11 @@ namespace ET
             component.Id = this.Id;
             component.ComponentParent = this;
             EventSystem.Instance.Awake(component);
+            
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component;
         }
 
@@ -745,6 +755,11 @@ namespace ET
             component.Id = this.Id;
             component.ComponentParent = this;
             EventSystem.Instance.Awake(component);
+            
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component as K;
         }
 
@@ -760,6 +775,11 @@ namespace ET
             component.Id = this.Id;
             component.ComponentParent = this;
             EventSystem.Instance.Awake(component, p1);
+            
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component as K;
         }
 
@@ -775,6 +795,11 @@ namespace ET
             component.Id = this.Id;
             component.ComponentParent = this;
             EventSystem.Instance.Awake(component, p1, p2);
+            
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component as K;
         }
 
@@ -790,6 +815,11 @@ namespace ET
             component.Id = this.Id;
             component.ComponentParent = this;
             EventSystem.Instance.Awake(component, p1, p2, p3);
+            
+            if (this is IAddComponent)
+            {
+                EventSystem.Instance.AddComponent(this, component);
+            }
             return component as K;
         }
         

+ 30 - 3
Unity/Codes/Model/Core/Object/EventSystem.cs

@@ -288,9 +288,9 @@ namespace ET
         }
         
         // GetComponentSystem
-        public void GetComponent(Entity component)
+        public void GetComponent(Entity entity, Entity component)
         {
-            List<object> iGetSystem = this.typeSystems.GetSystems(component.GetType(), typeof (IGetComponentSystem));
+            List<object> iGetSystem = this.typeSystems.GetSystems(entity.GetType(), typeof (IGetComponentSystem));
             if (iGetSystem == null)
             {
                 return;
@@ -305,7 +305,34 @@ namespace ET
 
                 try
                 {
-                    getSystem.Run(component);
+                    getSystem.Run(entity, component);
+                }
+                catch (Exception e)
+                {
+                    Log.Error(e);
+                }
+            }
+        }
+        
+        // AddComponentSystem
+        public void AddComponent(Entity entity, Entity component)
+        {
+            List<object> iAddSystem = this.typeSystems.GetSystems(entity.GetType(), typeof (IAddComponentSystem));
+            if (iAddSystem == null)
+            {
+                return;
+            }
+
+            foreach (IAddComponentSystem addComponentSystem in iAddSystem)
+            {
+                if (addComponentSystem == null)
+                {
+                    continue;
+                }
+
+                try
+                {
+                    addComponentSystem.Run(entity, component);
                 }
                 catch (Exception e)
                 {

+ 34 - 0
Unity/Codes/Model/Core/Object/IAddComponentSystem.cs

@@ -0,0 +1,34 @@
+using System;
+
+namespace ET
+{
+	public interface IAddComponent
+	{
+	}
+	
+	public interface IAddComponentSystem: ISystemType
+	{
+		void Run(object o, Entity component);
+	}
+
+	[ObjectSystem]
+	public abstract class AddComponentSystem<T> : IAddComponentSystem where T: IAddComponent
+	{
+		public void Run(object o, Entity component)
+		{
+			this.AddComponent((T)o, component);
+		}
+		
+		public Type SystemType()
+		{
+			return typeof(IGetComponentSystem);
+		}
+
+		public Type Type()
+		{
+			return typeof(T);
+		}
+
+		public abstract void AddComponent(T self, Entity component);
+	}
+}

+ 8 - 4
Unity/Codes/Model/Core/Object/IGetComponentSystem.cs

@@ -2,21 +2,25 @@
 
 namespace ET
 {
+	// GetComponentSystem有巨大作用,比如每次保存Unit的数据不需要所有组件都保存,只需要保存Unit变化过的组件
+	// 是否变化可以通过判断该组件是否GetComponent,Get了就记录该组件
+	// 这样可以只保存Unit变化过的组件
+	// 再比如传送也可以做此类优化
 	public interface IGetComponent
 	{
 	}
 	
 	public interface IGetComponentSystem: ISystemType
 	{
-		void Run(object o);
+		void Run(object o, Entity component);
 	}
 
 	[ObjectSystem]
 	public abstract class GetComponentSystem<T> : IGetComponentSystem where T: IGetComponent
 	{
-		public void Run(object o)
+		public void Run(object o, Entity component)
 		{
-			this.GetComponent((T)o);
+			this.GetComponent((T)o, component);
 		}
 		
 		public Type SystemType()
@@ -29,6 +33,6 @@ namespace ET
 			return typeof(T);
 		}
 
-		public abstract void GetComponent(T self);
+		public abstract void GetComponent(T self, Entity component);
 	}
 }

+ 10 - 1
Unity/Codes/Model/Core/Timer/TimerComponent.cs

@@ -74,7 +74,16 @@ namespace ET
         }
     }
 
-    public class TimerComponent: Entity, IAwake, IUpdate, ILoad
+    [ObjectSystem]
+    public class TimerComponentDestroySystem: DestroySystem<TimerComponent>
+    {
+        public override void Destroy(TimerComponent self)
+        {
+            TimerComponent.Instance = null;
+        }
+    }
+
+    public class TimerComponent: Entity, IAwake, IUpdate, ILoad, IDestroy
     {
         public static TimerComponent Instance
         {

+ 7 - 2
Unity/Codes/ModelView/Demo/Resource/ResourcesLoaderComponent.cs

@@ -14,7 +14,12 @@ namespace ET
                     list.AddRange(self.LoadedResource);
                     self.LoadedResource = null;
 
-                    // 延迟5秒卸载包,因为包卸载是引用技术,5秒之内假如重新有逻辑加载了这个包,那么可以避免一次卸载跟加载
+                    if (TimerComponent.Instance == null)
+                    {
+                        return;
+                    }
+                    
+                    // 延迟5秒卸载包,因为包卸载是引用计数,5秒之内假如重新有逻辑加载了这个包,那么可以避免一次卸载跟加载
                     await TimerComponent.Instance.WaitAsync(5000);
 
                     foreach (string abName in list)
@@ -44,7 +49,7 @@ namespace ET
             UnLoadAsync().Coroutine();
         }
     }
-
+    
     public class ResourcesLoaderComponent: Entity, IAwake, IDestroy
     {
         public HashSet<string> LoadedResource = new HashSet<string>();