瀏覽代碼

Actor消息改造

tanghai 2 年之前
父節點
當前提交
c340b92de1
共有 41 個文件被更改,包括 307 次插入157 次删除
  1. 2 0
      DotNet/Loader/CodeLoader.cs
  2. 0 14
      DotNet/Loader/Init.cs
  3. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor.meta
  4. 25 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorEntities.cs
  5. 3 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorEntities.cs.meta
  6. 5 3
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageDispatcherComponent.cs
  7. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageDispatcherComponent.cs.meta
  8. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageHandlerAttribute.cs
  9. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageHandlerAttribute.cs.meta
  10. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageLocationHandlerAttribute.cs
  11. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageLocationHandlerAttribute.cs.meta
  12. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSender.cs
  13. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSender.cs.meta
  14. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSenderComponent.cs
  15. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSenderComponent.cs.meta
  16. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/IMActorHandler.cs
  17. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/IMActorHandler.cs.meta
  18. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailBoxComponent.cs
  19. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailBoxComponent.cs.meta
  20. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailboxType.cs
  21. 0 0
      Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailboxType.cs.meta
  22. 6 1
      Unity/Assets/Scripts/Core/VProcess/Module/Entity/EntitySystemSingleton.cs
  23. 1 1
      Unity/Assets/Scripts/Core/VProcess/Module/Entity/SceneType.cs
  24. 18 36
      Unity/Assets/Scripts/Core/VProcess/Module/VProcessActor/VProcessActor.cs
  25. 28 6
      Unity/Assets/Scripts/Core/VProcess/VProcess.cs
  26. 84 8
      Unity/Assets/Scripts/Core/World/ActorId.cs
  27. 6 1
      Unity/Assets/Scripts/Core/World/Module/Network/OpcodeType.cs
  28. 4 3
      Unity/Assets/Scripts/Core/World/Module/VProcess/VProcessManager.cs
  29. 62 0
      Unity/Assets/Scripts/Core/World/Module/WorldActor/ActorQueue.cs
  30. 3 0
      Unity/Assets/Scripts/Core/World/Module/WorldActor/ActorQueue.cs.meta
  31. 5 50
      Unity/Assets/Scripts/Core/World/Module/WorldActor/WorldActor.cs
  32. 15 2
      Unity/Assets/Scripts/Core/World/World.cs
  33. 0 1
      Unity/Assets/Scripts/Hotfix/Server/Demo/EntryEvent2_InitServer.cs
  34. 1 6
      Unity/Assets/Scripts/Hotfix/Server/Module/Actor/ActorMessageSenderComponentSystem.cs
  35. 2 2
      Unity/Assets/Scripts/HotfixView/Client/Demo/Opera/OperaComponentSystem.cs
  36. 1 13
      Unity/Assets/Scripts/Loader/MonoBehaviour/Init.cs
  37. 15 1
      Unity/Assets/Scripts/Model/Share/Entry.cs
  38. 6 1
      Unity/Assets/Scripts/Model/Share/LockStep/LSEntitySystemSingleton.cs
  39. 1 0
      Unity/Assets/Scripts/Model/Share/Module/AI/AIDispatcherComponent.cs
  40. 6 1
      Unity/Assets/Scripts/Model/Share/Module/Message/MessageDispatcherComponent.cs
  41. 1 0
      Unity/Assets/Scripts/Model/Share/Module/Numeric/NumericWatcherComponent.cs

+ 2 - 0
DotNet/Loader/CodeLoader.cs

@@ -42,6 +42,8 @@ namespace ET
             Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(Assembly.GetEntryAssembly(), typeof(Init).Assembly, typeof (VProcess).Assembly, this.model, hotfixAssembly);
 
             World.Instance.AddSingleton<EventSystem, Dictionary<string, Type>>(types);
+            
+            World.Instance.Load();
         }
     }
 }

+ 0 - 14
DotNet/Loader/Init.cs

@@ -22,21 +22,7 @@ namespace ET
 						.WithParsed(World.Instance.AddSingleton);
 				World.Instance.AddSingleton<Logger>().ILog = new NLogger(Options.Instance.AppType.ToString(), Options.Instance.Process, "../Config/NLog/NLog.config");
 				ETTask.ExceptionHandler += Log.Error;
-				World.Instance.AddSingleton<OpcodeType>();
-				World.Instance.AddSingleton<IdValueGenerater>();
-				World.Instance.AddSingleton<ObjectPool>();
-				World.Instance.AddSingleton<WorldActor>();
 				World.Instance.AddSingleton<CodeLoader>();
-				World.Instance.AddSingleton<VProcessManager>();
-
-				VProcessManager.ThreadPoolScheduler threadPoolScheduler = World.Instance.AddSingleton<VProcessManager.ThreadPoolScheduler, int>(10);
-				
-				int vProcessId = VProcessManager.Instance.Create();
-				threadPoolScheduler.Add(vProcessId);
-				
-				WorldActor.Instance.Send(new ActorId(Options.Instance.Process, vProcessId, 0), null);
-				
-				Log.Console($"{Parser.Default.FormatCommandLine(Options.Instance)}");
 			}
 			catch (Exception e)
 			{

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor.meta


+ 25 - 0
Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorEntities.cs

@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+
+namespace ET
+{
+    public class ActorEntities
+    {
+        private readonly Dictionary<ActorId, Entity> actors = new();
+        
+        public void Add(Entity entity)
+        {
+            this.actors.Add(entity.GetActorId(), entity);
+        }
+        
+        public void Remove(Entity entity)
+        {
+            this.actors.Add(entity.GetActorId(), entity);
+        }
+
+        public Entity Get(ActorId actorId)
+        {
+            this.actors.TryGetValue(actorId, out Entity entity);
+            return entity;
+        }
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorEntities.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4df8b1e7a9a24667be310e2a897bff9a
+timeCreated: 1687353925

+ 5 - 3
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageDispatcherComponent.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageDispatcherComponent.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace ET.Server
+namespace ET
 {
     public class ActorMessageDispatcherInfo
     {
@@ -43,6 +43,7 @@ namespace ET.Server
         
         public void Load()
         {
+            World.Instance.AddSingleton<ActorMessageDispatcherComponent>();
         }
 
         private void Register(Type type)
@@ -89,7 +90,7 @@ namespace ET.Server
             this.ActorMessageHandlers[type].Add(handler);
         }
 
-        private async ETTask Handle(Entity entity, ActorId actorId, object message)
+        public async ETTask Handle(Entity entity, ActorId actorId, object message)
         {
             List<ActorMessageDispatcherInfo> list;
             if (!this.ActorMessageHandlers.TryGetValue(message.GetType(), out list))
@@ -209,6 +210,7 @@ namespace ET.Server
                 default:
                     throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorMessage}");
             }
-        }*/
+        }
+        */
     }
 }

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageDispatcherComponent.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageDispatcherComponent.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageHandlerAttribute.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageHandlerAttribute.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace ET.Server
+namespace ET
 {
     public class ActorMessageHandlerAttribute: BaseAttribute
     {

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageHandlerAttribute.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageHandlerAttribute.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/ActorLocation/ActorMessageLocationHandlerAttribute.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageLocationHandlerAttribute.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace ET.Server
+namespace ET
 {
     public class ActorMessageLocationHandlerAttribute: ActorMessageHandlerAttribute
     {

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/ActorLocation/ActorMessageLocationHandlerAttribute.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageLocationHandlerAttribute.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageSender.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSender.cs

@@ -1,6 +1,6 @@
 using System.IO;
 
-namespace ET.Server
+namespace ET
 {
     // 知道对方的instanceId,使用这个类发actor消息
     public readonly struct ActorMessageSender

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageSender.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSender.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageSenderComponent.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSenderComponent.cs

@@ -1,6 +1,6 @@
 using System.Collections.Generic;
 
-namespace ET.Server
+namespace ET
 {
     [ComponentOf(typeof(VProcess))]
     public class ActorMessageSenderComponent: SingletonEntity<ActorMessageSenderComponent>, IAwake, IDestroy

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/ActorMessageSenderComponent.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/ActorMessageSenderComponent.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/IMActorHandler.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/IMActorHandler.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace ET.Server
+namespace ET
 {
     public interface IMActorHandler
     {

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/IMActorHandler.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/IMActorHandler.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/MailBoxComponent.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailBoxComponent.cs

@@ -1,4 +1,4 @@
-namespace ET.Server
+namespace ET
 {
     /// <summary>
     /// 挂上这个组件表示该Entity是一个Actor,接收的消息将会队列处理

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/MailBoxComponent.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailBoxComponent.cs.meta


+ 1 - 1
Unity/Assets/Scripts/Model/Server/Module/Actor/MailboxType.cs → Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailboxType.cs

@@ -1,4 +1,4 @@
-namespace ET.Server
+namespace ET
 {
     public enum MailboxType
     {

+ 0 - 0
Unity/Assets/Scripts/Model/Server/Module/Actor/MailboxType.cs.meta → Unity/Assets/Scripts/Core/VProcess/Module/Actor/MailboxType.cs.meta


+ 6 - 1
Unity/Assets/Scripts/Core/VProcess/Module/Entity/EntitySystemSingleton.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 
 namespace ET
 {
-    public class EntitySystemSingleton: Singleton<EntitySystemSingleton>, ISingletonAwake
+    public class EntitySystemSingleton: Singleton<EntitySystemSingleton>, ISingletonAwake, ISingletonLoad
     {
         public TypeSystems TypeSystems { get; private set; }
         
@@ -28,6 +28,11 @@ namespace ET
             }
         }
         
+        public void Load()
+        {
+            World.Instance.AddSingleton<EntitySystemSingleton>();
+        }
+        
         public void Serialize(Entity component)
         {
             if (component is not ISerialize)

+ 1 - 1
Unity/Assets/Scripts/Core/VProcess/Module/Entity/SceneType.cs

@@ -23,7 +23,7 @@ namespace ET
 		Room = 1 << 15,
 		LockStepClient = 1 << 16,
 		LockStepServer = 1 << 17,
-		Root = 1 << 18,
+		Main = 1 << 18,
 
 		// 客户端Model层
 		Demo = 1 << 30,

+ 18 - 36
Unity/Assets/Scripts/Core/VProcess/Module/VProcessActor/VProcessActor.cs

@@ -20,61 +20,43 @@ namespace ET
             
             base.Dispose();
             
-            WorldActor.Instance.RemoveActor((int)this.Root().Id);
+            ActorQueue.Instance.RemoveQueue((int)this.Root().Id);
         }
 
         public void Awake()
         {
-            WorldActor.Instance.AddActor((int)this.Root().Id);
+            ActorQueue.Instance.AddQueue((int)this.Root().Id);
         }
 
         public void Update()
         {
             this.list.Clear();
-            WorldActor.Instance.Fetch((int)this.Root().Id, 1000, this.list);
+            VProcess vProcess = this.Root();
+            ActorQueue.Instance.Fetch((int)vProcess.Id, 1000, this.list);
+            
+            ActorMessageDispatcherComponent actorMessageDispatcherComponent = ActorMessageDispatcherComponent.Instance;
             foreach (ActorMessageInfo actorMessageInfo in this.list)
             {
-                this.HandleMessage(actorMessageInfo.ActorId, actorMessageInfo.MessageObject);    
-            }
-        }
-        
-        private void HandleMessage(ActorId actorId, MessageObject messageObject)
-        {
-            switch (messageObject)
-            {
-                case IResponse iResponse:
-                {
-                    if (this.requestCallbacks.TryGetValue(iResponse.RpcId, out ETTask<IResponse> task))
-                    {
-                        task.SetResult(iResponse);
-                    }
-                    break;
-                }
-                case IRequest iRequest:
+                if (actorMessageInfo.MessageObject is IResponse response)
                 {
-                    WorldActor.Instance.Handle(actorId, messageObject);
-                    break;
-                }
-                default: // IMessage:
-                {
-                    WorldActor.Instance.Handle(actorId, messageObject);
-                    break;
+                    HandleResponse(response);
+                    continue;
                 }
+
+                Entity entity = vProcess.ActorEntities.Get(actorMessageInfo.ActorId);
+                actorMessageDispatcherComponent.Handle(entity, actorMessageInfo.ActorId, actorMessageInfo.MessageObject).Coroutine();    
             }
         }
-        
-        public void Send(ActorId actorId, MessageObject messageObject)
+
+        private void HandleResponse(IResponse response)
         {
-            WorldActor.Instance.Send(actorId, messageObject);
+            
         }
         
-        public async ETTask<IResponse> Call(ActorId actorId, IRequest request)
+        public void Send(ActorId actorId, MessageObject messageObject)
         {
-            ETTask<IResponse> task = ETTask<IResponse>.Create(true);
-            request.RpcId = ++this.rpcId;
-            this.requestCallbacks.Add(request.RpcId, task);
-            this.Send(actorId, request as MessageObject);
-            return await task;
+            VProcess vProcess = this.Root();
+            ActorQueue.Instance.Send(new Address(vProcess.Process, (int)vProcess.Id), actorId, messageObject);
         }
     }
 }

+ 28 - 6
Unity/Assets/Scripts/Core/VProcess/VProcess.cs

@@ -7,7 +7,23 @@ namespace ET
     {
         [ThreadStatic]
         [StaticField]
-        public static VProcess Instance;
+        private static VProcess instance;
+
+        public static VProcess Instance
+        {
+            get
+            {
+                return instance;
+            }
+        }
+
+        public Address Address
+        {
+            get
+            {
+                return new Address(this.Process, (int)this.Id);
+            }
+        }
         
         public IScene Root { get; set; }
         public SceneType SceneType { get; set; }
@@ -17,24 +33,26 @@ namespace ET
         public EntitySystem EntitySystem { get; }
         public TimeInfo TimeInfo { get; }
         public IdGenerater IdGenerater { get; }
+        public ActorEntities ActorEntities { get; }
 
         public bool IsRuning;
         
-        // actor
-        private readonly Dictionary<long, Entity> actors = new();
-
-        public VProcess(int process, int id)
+        public VProcess(int id, int process, SceneType sceneType)
         {
+            this.SceneType = sceneType;
             this.Id = id;
             this.Process = process;
             this.Root = this;
             this.EntitySystem = new EntitySystem();
             this.TimeInfo = new TimeInfo();
             this.IdGenerater = new IdGenerater(process, this.TimeInfo);
+            this.ActorEntities = new ActorEntities();
         }
 
         public void Update()
         {
+            instance = this;
+            
             this.TimeInfo.Update();
             
             this.EntitySystem.Update();
@@ -42,6 +60,8 @@ namespace ET
         
         public void LateUpdate()
         {
+            instance = this;
+            
             this.EntitySystem.LateUpdate();
 
             FrameFinishUpdate();
@@ -66,9 +86,11 @@ namespace ET
             base.Dispose();
             
             this.IsRuning = false;
+
+            instance = null;
         }
 
-#region AddComponent
+        #region AddComponent
 
         public new K AddComponent<K>(bool isFromPool = false) where K : SingletonEntity<K>, IAwake, new()
         {

+ 84 - 8
Unity/Assets/Scripts/Core/World/ActorId.cs

@@ -1,16 +1,63 @@
 using System;
 using System.Runtime.InteropServices;
 using MemoryPack;
+using MongoDB.Bson.Serialization.Attributes;
 
 namespace ET
 {
+    [MemoryPackable]
+    [StructLayout(LayoutKind.Sequential, Pack = 1)]
+    public partial struct Address
+    {
+        [MemoryPackOrder(0)]
+        public int Process;
+        [MemoryPackOrder(1)]
+        public int VProcess;
+        
+        public bool Equals(Address other)
+        {
+            return this.Process == other.Process && this.VProcess == other.VProcess;
+        }
+
+        public override bool Equals(object obj)
+        {
+            return obj is Address other && Equals(other);
+        }
+
+        public override int GetHashCode()
+        {
+            return HashCode.Combine(this.Process, this.VProcess);
+        }
+        
+        public Address(int process, int vProcess)
+        {
+            this.Process = process;
+            this.VProcess = vProcess;
+        }
+
+        public static bool operator ==(Address left, Address right)
+        {
+            return left.Process == right.Process && left.VProcess == right.VProcess;
+        }
+
+        public static bool operator !=(Address left, Address right)
+        {
+            return !(left == right);
+        }
+
+        public override string ToString()
+        {
+            return $"{this.Process}:{this.VProcess}";
+        }
+    }
+    
     [MemoryPackable]
     [StructLayout(LayoutKind.Sequential, Pack = 1)]
     public partial struct ActorId
     {
         public bool Equals(ActorId other)
         {
-            return this.Process == other.Process && this.VProcess == other.VProcess && this.InstanceId == other.InstanceId;
+            return this.Address == other.Address && this.InstanceId == other.InstanceId;
         }
 
         public override bool Equals(object obj)
@@ -20,26 +67,55 @@ namespace ET
 
         public override int GetHashCode()
         {
-            return HashCode.Combine(this.Process, this.VProcess, this.InstanceId);
+            return HashCode.Combine(this.Address, this.InstanceId);
         }
 
         [MemoryPackOrder(0)]
-        public int Process;
+        public Address Address;
         [MemoryPackOrder(1)]
-        public int VProcess;
-        [MemoryPackOrder(2)]
         public long InstanceId;
+
+        [BsonIgnore]
+        public int Process
+        {
+            get
+            {
+                return this.Address.Process;
+            }
+            set
+            {
+                this.Address.Process = value;
+            }
+        }
+        
+        [BsonIgnore]
+        public int VProcess
+        {
+            get
+            {
+                return this.Address.VProcess;
+            }
+            set
+            {
+                this.Address.VProcess = value;
+            }
+        }
         
         public ActorId(int process, int vProcess, long instanceId)
         {
-            this.Process = process;
-            this.VProcess = vProcess;
+            this.Address = new Address(process, vProcess);
+            this.InstanceId = instanceId;
+        }
+        
+        public ActorId(Address address, long instanceId)
+        {
+            this.Address = address;
             this.InstanceId = instanceId;
         }
 
         public static bool operator ==(ActorId left, ActorId right)
         {
-            return left.InstanceId == right.InstanceId && left.Process == right.Process && left.VProcess == right.VProcess;
+            return left.InstanceId == right.InstanceId && left.Address == right.Address;
         }
 
         public static bool operator !=(ActorId left, ActorId right)

+ 6 - 1
Unity/Assets/Scripts/Core/World/Module/Network/OpcodeType.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 
 namespace ET
 {
-    public class OpcodeType: Singleton<OpcodeType>, ISingletonAwake
+    public class OpcodeType: Singleton<OpcodeType>, ISingletonAwake, ISingletonLoad
     {
         // 初始化后不变,所以主线程,网络线程都可以读
         private readonly DoubleMap<Type, ushort> typeOpcode = new();
@@ -84,5 +84,10 @@ namespace ET
 
             return response;
         }
+
+        public void Load()
+        {
+            World.Instance.AddSingleton<OpcodeType>();
+        }
     }
 }

+ 4 - 3
Unity/Assets/Scripts/Core/World/Module/VProcess/VProcessManager.cs

@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
 
 namespace ET
 {
@@ -11,7 +12,7 @@ namespace ET
         {
         }
         
-        public int Create(int processId = 0)
+        public int Create(int processId, SceneType sceneType)
         {
             lock (this)
             {
@@ -19,7 +20,7 @@ namespace ET
                 {
                     processId = --this.idGenerator;
                 }
-                VProcess vProcess = new(Options.Instance.Process, processId);
+                VProcess vProcess = new(processId, Options.Instance.Process, sceneType);
                 vProcess.AddComponent<VProcessActor>();
                 this.vProcesses.Add((int)vProcess.Id, vProcess);
                 return processId;

+ 62 - 0
Unity/Assets/Scripts/Core/World/Module/WorldActor/ActorQueue.cs

@@ -0,0 +1,62 @@
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+
+namespace ET
+{
+    public struct ActorMessageInfo
+    {
+        public ActorId ActorId;
+        public MessageObject MessageObject;
+    }
+    
+    public class ActorQueue: Singleton<ActorQueue>, ISingletonAwake
+    {
+        private readonly ConcurrentDictionary<int, ConcurrentQueue<ActorMessageInfo>> messages = new();
+        
+        public void Awake()
+        {
+        }
+
+        public void Send(ActorId actorId, MessageObject messageObject)
+        {
+            this.Send(actorId.Address, actorId, messageObject);
+        }
+        
+        public void Send(Address fromAddress, ActorId actorId, MessageObject messageObject)
+        {
+            if (!this.messages.TryGetValue(actorId.Address.VProcess, out var queue))
+            {
+                return;
+            }
+            queue.Enqueue(new ActorMessageInfo() {ActorId = new ActorId(fromAddress, actorId.InstanceId), MessageObject = messageObject});
+        }
+        
+        public void Fetch(int processId, int count, List<ActorMessageInfo> list)
+        {
+            if (!this.messages.TryGetValue(processId, out var queue))
+            {
+                return;
+            }
+
+            for (int i = 0; i < count; ++i)
+            {
+                if (!queue.TryDequeue(out ActorMessageInfo message))
+                {
+                    break;
+                }
+                list.Add(message);
+            }
+        }
+
+        public void AddQueue(int processId)
+        {
+            var queue = new ConcurrentQueue<ActorMessageInfo>();
+            this.messages[processId] = queue;
+        }
+        
+        public void RemoveQueue(int processId)
+        {
+            this.messages.TryRemove(processId, out _);
+        }
+    }
+}

+ 3 - 0
Unity/Assets/Scripts/Core/World/Module/WorldActor/ActorQueue.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4bc600297c654056823d9ac4821e69b1
+timeCreated: 1687350779

+ 5 - 50
Unity/Assets/Scripts/Core/World/Module/WorldActor/WorldActor.cs

@@ -4,24 +4,11 @@ using System.Collections.Generic;
 
 namespace ET
 {
-    public struct ActorMessageInfo
-    {
-        public ActorId ActorId;
-        public MessageObject MessageObject;
-    }
-    
     public class WorldActor: Singleton<WorldActor>, ISingletonAwake
     {
         private readonly Dictionary<Type, List<IProcessActorHandler>> handlers = new();
 
-        private readonly ConcurrentDictionary<int, ConcurrentQueue<ActorMessageInfo>> messages = new();
-        
         public void Awake()
-        {
-            this.Load();
-        }
-
-        public void Load()
         {
             var types = EventSystem.Instance.GetTypes(typeof (ProcessActorHandlerAttribute));
             foreach (Type type in types)
@@ -43,6 +30,11 @@ namespace ET
             }
         }
 
+        public void Load()
+        {
+            World.Instance.AddSingleton<WorldActor>();
+        }
+
         public void Handle(ActorId actorId, MessageObject messageObject)
         {
             if (!this.handlers.TryGetValue(messageObject.GetType(), out var list))
@@ -55,42 +47,5 @@ namespace ET
                 processActorHandler.Handle(actorId, messageObject);
             }
         }
-        
-        public void Send(ActorId actorId, MessageObject messageObject)
-        {
-            if (!this.messages.TryGetValue(actorId.VProcess, out var queue))
-            {
-                return;
-            }
-            queue.Enqueue(new ActorMessageInfo() {ActorId = actorId, MessageObject = messageObject});
-        }
-        
-        public void Fetch(int processId, int count, List<ActorMessageInfo> list)
-        {
-            if (!this.messages.TryGetValue(processId, out var queue))
-            {
-                return;
-            }
-
-            for (int i = 0; i < count; ++i)
-            {
-                if (!queue.TryDequeue(out ActorMessageInfo message))
-                {
-                    break;
-                }
-                list.Add(message);
-            }
-        }
-
-        public void AddActor(int processId)
-        {
-            var queue = new ConcurrentQueue<ActorMessageInfo>();
-            this.messages[processId] = queue;
-        }
-        
-        public void RemoveActor(int processId)
-        {
-            this.messages.TryRemove(processId, out _);
-        }
     }
 }

+ 15 - 2
Unity/Assets/Scripts/Core/World/World.cs

@@ -1,6 +1,6 @@
 using System;
 using System.Collections.Concurrent;
-using System.Collections.Generic;
+using System.Linq;
 
 namespace ET
 {
@@ -67,7 +67,20 @@ namespace ET
 
         public void Load()
         {
-            
+            foreach (Type type in this.singletons.Keys.ToArray())
+            {
+                if (!this.singletons.TryGetValue(type, out ISingleton singleton))
+                {
+                    continue;
+                }
+
+                if (singleton is not ISingletonLoad singletonLoad)
+                {
+                    continue;
+                }
+                
+                singletonLoad.Load();
+            }
         }
     }
 }

+ 0 - 1
Unity/Assets/Scripts/Hotfix/Server/Demo/EntryEvent2_InitServer.cs

@@ -17,7 +17,6 @@ namespace ET.Server
             scene.AddComponent<LocationProxyComponent>();
             scene.AddComponent<ServerSceneManagerComponent>();
             scene.AddComponent<RobotCaseComponent>();
-
             scene.AddComponent<NavmeshComponent>();
 
             StartProcessConfig processConfig = StartProcessConfigCategory.Instance.Get(scene.Process);

+ 1 - 6
Unity/Assets/Scripts/Hotfix/Server/Module/Actor/ActorMessageSenderComponentSystem.cs

@@ -96,12 +96,7 @@ namespace ET.Server
             // 这里做了优化,如果发向同一个进程,则等一帧直接处理,不需要通过网络层
             if (actorId.Process == VProcess.Instance.Process)
             {
-                async ETTask HandleMessageInNextFrame()
-                {
-                    await TimerComponent.Instance.WaitFrameAsync();
-                    NetInnerComponent.Instance.HandleMessage(actorId, message);    
-                }
-                HandleMessageInNextFrame().Coroutine();
+                ActorQueue.Instance.Send(VProcess.Instance.Address, actorId, message as MessageObject);
                 return;
             }
             

+ 2 - 2
Unity/Assets/Scripts/HotfixView/Client/Demo/Opera/OperaComponentSystem.cs

@@ -29,8 +29,8 @@ namespace ET.Client
 
             if (Input.GetKeyDown(KeyCode.R))
             {
-                World.Instance.Load();
-                Log.Debug("hot reload success!");
+                CodeLoader.Instance.LoadHotfix();
+                return;
             }
         
             if (Input.GetKeyDown(KeyCode.T))

+ 1 - 13
Unity/Assets/Scripts/Loader/MonoBehaviour/Init.cs

@@ -24,19 +24,7 @@ namespace ET
 			
 			World.Instance.AddSingleton<Logger>().ILog = new UnityLogger();
 			ETTask.ExceptionHandler += Log.Error;
-			World.Instance.AddSingleton<OpcodeType>();
-			World.Instance.AddSingleton<IdValueGenerater>();
-			World.Instance.AddSingleton<ObjectPool>();
-			World.Instance.AddSingleton<WorldActor>();
-			World.Instance.AddSingleton<CodeLoader>();
-			World.Instance.AddSingleton<VProcessManager>();
-			VProcessManager.MainThreadScheduler mainThreadScheduler = World.Instance.AddSingleton<VProcessManager.MainThreadScheduler>();
-
-			int vProcessId = VProcessManager.Instance.Create();
-			mainThreadScheduler.Add(vProcessId);
-			
-			// 发送消息
-			WorldActor.Instance.Send(new ActorId(Options.Instance.Process, vProcessId, 1), null);
+			World.Instance.AddSingleton<CodeLoader>().Start();
 		}
 
 		private void Update()

+ 15 - 1
Unity/Assets/Scripts/Model/Share/Entry.cs

@@ -37,12 +37,26 @@ namespace ET
             MongoHelper.RegisterStruct<LSInput>();
             MongoHelper.Register();
             
+            World.Instance.AddSingleton<OpcodeType>();
+            World.Instance.AddSingleton<IdValueGenerater>();
+            World.Instance.AddSingleton<ObjectPool>();
+            World.Instance.AddSingleton<WorldActor>();
+            World.Instance.AddSingleton<ActorQueue>();
             World.Instance.AddSingleton<EntitySystemSingleton>();
             World.Instance.AddSingleton<LSEntitySystemSingleton>();
             World.Instance.AddSingleton<MessageDispatcherComponent>();
             World.Instance.AddSingleton<NumericWatcherComponent>();
             World.Instance.AddSingleton<AIDispatcherComponent>();
-            
+            World.Instance.AddSingleton<VProcessManager>();
+            VProcessManager.MainThreadScheduler mainThreadScheduler = World.Instance.AddSingleton<VProcessManager.MainThreadScheduler>();
+
+            int vProcessId = VProcessManager.Instance.Create(0, SceneType.Main);
+            mainThreadScheduler.Add(vProcessId);
+			
+            // 发送消息
+            ActorQueue.Instance.Send(new ActorId(Options.Instance.Process, vProcessId, 1), null);
+
+
             VProcess vProcess = VProcess.Instance;
             
             vProcess.AddComponent<MainThreadSynchronizationContext>();

+ 6 - 1
Unity/Assets/Scripts/Model/Share/LockStep/LSEntitySystemSingleton.cs

@@ -11,7 +11,7 @@ namespace ET
         public const int Max = 1;
     }
     
-    public class LSEntitySystemSingleton: Singleton<LSEntitySystemSingleton>, ISingletonAwake
+    public class LSEntitySystemSingleton: Singleton<LSEntitySystemSingleton>, ISingletonAwake, ISingletonLoad
     {
         public TypeSystems TypeSystems { get; private set; }
         
@@ -37,6 +37,11 @@ namespace ET
             }
         }
         
+        public void Load()
+        {
+            World.Instance.AddSingleton<LSEntitySystemSingleton>();
+        }
+        
         public TypeSystems.OneTypeSystems GetOneTypeSystems(Type type)
         {
             return this.TypeSystems.GetOneTypeSystems(type);

+ 1 - 0
Unity/Assets/Scripts/Model/Share/Module/AI/AIDispatcherComponent.cs

@@ -24,6 +24,7 @@ namespace ET
 
         public void Load()
         {
+            World.Instance.AddSingleton<AIDispatcherComponent>();
         }
 
         public AAIHandler Get(string key)

+ 6 - 1
Unity/Assets/Scripts/Model/Share/Module/Message/MessageDispatcherComponent.cs

@@ -15,7 +15,7 @@ namespace ET
         }
     }
     
-    public class MessageDispatcherComponent: Singleton<MessageDispatcherComponent>, ISingletonAwake
+    public class MessageDispatcherComponent: Singleton<MessageDispatcherComponent>, ISingletonAwake, ISingletonLoad
     {
         private readonly Dictionary<ushort, List<MessageDispatcherInfo>> handlers = new();
         
@@ -53,6 +53,11 @@ namespace ET
             }
         }
         
+        public void Load()
+        {
+            World.Instance.AddSingleton<MessageDispatcherComponent>();
+        }
+        
         private void RegisterHandler(ushort opcode, MessageDispatcherInfo handler)
         {
             if (!this.handlers.ContainsKey(opcode))

+ 1 - 0
Unity/Assets/Scripts/Model/Share/Module/Numeric/NumericWatcherComponent.cs

@@ -45,6 +45,7 @@ namespace ET
 
         public void Load()
         {
+            World.Instance.AddSingleton<NumericWatcherComponent>();
         }
         
         public void Run(Unit unit, EventType.NumbericChange args)