Pārlūkot izejas kodu

增加了一个简单版EventSystem接口,消息收发不需要考虑scene

大爷 2 gadi atpakaļ
vecāks
revīzija
d3b7dd2b50

+ 23 - 2
Unity/Assets/Scripts/Core/Module/EventSystem/EventSystem.cs

@@ -629,7 +629,7 @@ namespace ET
                 return;
             }
 
-            SceneType sceneType = scene.SceneType;
+            SceneType sceneType = scene == null ? SceneType.None: scene.SceneType;
             foreach (EventInfo eventInfo in iEvents)
             {
                 if (sceneType != eventInfo.SceneType && eventInfo.SceneType != SceneType.None)
@@ -647,7 +647,28 @@ namespace ET
                 aEvent.Handle(scene, a).Coroutine();
             }
         }
-        
+
+        //更简单版本
+        public void Publish<T>(T t = null) where T : class
+        {
+            List<EventInfo> iEvents;
+            if (!this.allEvents.TryGetValue(typeof(T), out iEvents))
+            {
+                return;
+            }
+
+            foreach (EventInfo eventInfo in iEvents)
+            {
+                if (!(eventInfo.IEvent is BEvent<T> bEvent))
+                {
+                    Log.Error($"event error: {eventInfo.IEvent.GetType().Name}");
+                    continue;
+                }
+
+                bEvent.OnEvent(t).Coroutine();
+            }
+        }
+
         // Invoke跟Publish的区别(特别注意)
         // Invoke类似函数,必须有被调用方,否则异常,调用者跟被调用者属于同一模块,比如MoveComponent中的Timer计时器,调用跟被调用的代码均属于移动模块
         // 既然Invoke跟函数一样,那么为什么不使用函数呢? 因为有时候不方便直接调用,比如Config加载,在客户端跟服务端加载方式不一样。比如TimerComponent需要根据Id分发

+ 14 - 1
Unity/Assets/Scripts/Core/Module/EventSystem/IEvent.cs

@@ -31,4 +31,17 @@ namespace ET
 			}
 		}
 	}
-}
+
+    public abstract class BEvent<A>: IEvent
+    {
+        public Type Type
+        {
+            get
+            {
+                return typeof(A);
+            }
+        }
+
+        public abstract ETTask OnEvent(A a);
+    }
+}