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

Merge pull request #1 from egametang/master

title
northroom 8 лет назад
Родитель
Сommit
60f9a239a2
100 измененных файлов с 1545 добавлено и 2488 удалено
  1. BIN
      Config/BuffConfig.txt
  2. 8 8
      Config/StartConfig/127.0.0.1.txt
  3. 6 6
      Config/StartConfig/192.168.12.112.txt
  4. 6 6
      Config/StartConfig/192.168.9.182.txt
  5. 1 1
      Config/StartConfig/LocalAllServer.txt
  6. 85 0
      Doc/组件设计.md
  7. 0 28
      README
  8. 53 0
      README.md
  9. 4 2
      Server/App/Program.cs
  10. 1 1
      Server/Hotfix/Handler/C2G_LoginGateHandler.cs
  11. 6 6
      Server/Hotfix/Handler/C2R_LoginHandler.cs
  12. 36 0
      Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs
  13. 36 0
      Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs
  14. 32 0
      Server/Hotfix/Handler/DBQueryRequestHandler.cs
  15. 39 0
      Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs
  16. 33 0
      Server/Hotfix/Handler/DBSaveRequestHandler.cs
  17. 1 1
      Server/Hotfix/Handler/G2M_CreateUnitHandler.cs
  18. 1 1
      Server/Hotfix/Handler/M2A_ReloadHandler.cs
  19. 5 0
      Server/Hotfix/Server.Hotfix.csproj
  20. 0 0
      Server/Model/Base/Config/ACategory.cs
  21. 0 0
      Server/Model/Base/Config/AConfig.cs
  22. 0 0
      Server/Model/Base/Config/AConfigComponent.cs
  23. 0 0
      Server/Model/Base/Config/ConfigAttribute.cs
  24. 3 3
      Server/Model/Base/Config/ConfigHelper.cs
  25. 0 0
      Server/Model/Base/Config/ICategory.cs
  26. 0 0
      Server/Model/Base/Event/AEventAttribute.cs
  27. 0 0
      Server/Model/Base/Event/Env.cs
  28. 0 0
      Server/Model/Base/Event/EnvKey.cs
  29. 0 0
      Server/Model/Base/Event/EventAttribute.cs
  30. 18 0
      Server/Model/Base/Event/EventIdType.cs
  31. 0 0
      Server/Model/Base/Event/IEvent.cs
  32. 1 1
      Server/Model/Base/Helper/DllHelper.cs
  33. 0 0
      Server/Model/Base/Message/AActorMessage.cs
  34. 21 8
      Server/Model/Base/Message/AMActorHandler.cs
  35. 0 20
      Server/Model/Base/Message/AMRpcHandler.cs
  36. 0 0
      Server/Model/Base/Message/AMessage.cs
  37. 0 0
      Server/Model/Base/Message/ActorMessageAttribute.cs
  38. 0 0
      Server/Model/Base/Message/ActorMessageHandlerAttribute.cs
  39. 0 0
      Server/Model/Base/Message/ErrorCode.cs
  40. 3 0
      Server/Model/Base/Message/IEntityActorHandler.cs
  41. 1 1
      Server/Model/Base/Message/IMActorHandler.cs
  42. 0 0
      Server/Model/Base/Message/IMHandler.cs
  43. 0 0
      Server/Model/Base/Message/InnerMessageDispatcher.cs
  44. 0 0
      Server/Model/Base/Message/MessageAttribute.cs
  45. 0 0
      Server/Model/Base/Message/MessageHandlerAttribute.cs
  46. 0 0
      Server/Model/Base/Message/OpcodeHelper.cs
  47. 0 0
      Server/Model/Base/Message/OuterMessageDispatcher.cs
  48. 0 0
      Server/Model/Base/Object/ComponentDB.cs
  49. 0 0
      Server/Model/Base/Object/EntityType.cs
  50. 3 3
      Server/Model/Base/Object/ObjectEvents.cs
  51. 3 3
      Server/Model/Component/ActorComponent.cs
  52. 1 6
      Server/Model/Component/ActorMessageDispatherComponent.cs
  53. 1 1
      Server/Model/Component/ActorProxyComponent.cs
  54. 0 232
      Server/Model/Component/EventComponent.cs
  55. 2 2
      Server/Model/Component/LocationComponent.cs
  56. 0 110
      Server/Model/Component/TimerComponent.cs
  57. 2 2
      Server/Model/Component/Unit/LockComponent.cs
  58. 26 11
      Server/Model/Entity/ActorProxy.cs
  59. 1 1
      Server/Model/Entity/Config/BuffConfig.cs
  60. 3 3
      Server/Model/Entity/EntityDB.cs
  61. 2 2
      Server/Model/Entity/Http.cs
  62. 1 1
      Server/Model/Entity/Location.cs
  63. 0 247
      Server/Model/Entity/Session.cs
  64. 0 18
      Server/Model/Event/EventIdType.cs
  65. 0 43
      Server/Model/Message/AppType.cs
  66. 0 7
      Server/Model/Message/IMessageDispatcher.cs
  67. 0 18
      Server/Model/Message/IMessagePacker.cs
  68. 0 23
      Server/Model/Message/RpcException.cs
  69. 0 51
      Server/Model/Object/Component.cs
  70. 0 30
      Server/Model/Object/Disposer.cs
  71. 0 215
      Server/Model/Object/Entity.cs
  72. 0 22
      Server/Model/Object/IAwake.cs
  73. 0 7
      Server/Model/Object/ILoad.cs
  74. 0 7
      Server/Model/Object/IUpdate.cs
  75. 0 42
      Server/Model/Object/Object.cs
  76. 0 9
      Server/Model/Object/ObjectEventAttribute.cs
  77. 92 50
      Server/Model/Server.Model.csproj
  78. 6 0
      Server/Model/Server.Model.csproj.user
  79. 0 1174
      Unity/Assets/Bundles/UI/Lobby.prefab
  80. 0 8
      Unity/Assets/Bundles/UI/Lobby.prefab.meta
  81. 865 0
      Unity/Assets/Bundles/UI/UILogin.prefab
  82. 9 0
      Unity/Assets/Bundles/UI/UILogin.prefab.meta
  83. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor.meta
  84. 3 2
      Unity/Assets/Editor/BehaviorTreeEditor/BTEditor.cs
  85. 18 9
      Unity/Assets/Editor/BehaviorTreeEditor/BTEditorWindow.cs
  86. 11 8
      Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeNodeClassPopup.cs
  87. 34 1
      Unity/Assets/Editor/BehaviorTreeEditor/Component/BTDebugComponent.cs
  88. 10 1
      Unity/Assets/Editor/BehaviorTreeEditor/Component/BTNodeInfoComponent.cs
  89. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeAfterChangeNodeTypeEvent_SelectNode.cs
  90. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeClickNodeEvent_SelectNode.cs
  91. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeConnectStateEvent_HandleConnectLines.cs
  92. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeCreateNodeEvent_SelectNode.cs
  93. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeMouseInNodeEvent_HandleOperate.cs
  94. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeNewCreateClickEvent_CreateNode.cs
  95. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeOpenEditorEvent_SelectNode.cs
  96. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeOpenEditorEvent_UpdatePropList.cs
  97. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeReplaceClickEvent_ReplaceNode.cs
  98. 1 1
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeRightDesignerDragEvent_ModifyRightBorder.cs
  99. 22 7
      Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeRunTreeEvent_ShowDebugInfo.cs
  100. 19 8
      Unity/Assets/Editor/BehaviorTreeEditor/PropertyDesigner.cs

BIN
Config/BuffConfig.txt


+ 8 - 8
Config/StartConfig/127.0.0.1.txt

@@ -1,8 +1,8 @@
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20000 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10000, "Host2" : null }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("98565862653976"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("98565862653977"), "Host" : "127.0.0.1", "Port" : 10001 }], "AppId" : 2, "AppType" : "Location", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20001 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10002, "Host2" : null }], "AppId" : 3, "AppType" : "Realm", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20002 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10003, "Host2" : null }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20003 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10004, "Host2" : null }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20004 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10005, "Host2" : null }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "127.0.0.1", "Port" : 20005 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "127.0.0.1", "Port" : 10006, "Host2" : null }], "AppId" : 7, "AppType" : "Gate", "ServerIP" : "*" }
-{ "_t" : "StartConfig", "_id" : NumberLong("98565723062316"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("98565723062317"), "Host" : "127.0.0.1", "Port" : 20006 }], "AppId" : 8, "AppType" : "Map", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20000 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10000, "Host2" : null }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("98565862653976"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 10001 }], "AppId" : 2, "AppType" : "Location", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20001 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10002, "Host2" : null }], "AppId" : 3, "AppType" : "Realm", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20002 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10003, "Host2" : null }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20003 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10004, "Host2" : null }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20004 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10005, "Host2" : null }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20005 }, { "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10006, "Host2" : null }], "AppId" : 7, "AppType" : "Gate", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("98565723062316"), "components" : [{ "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20006 }], "AppId" : 8, "AppType" : "Map", "ServerIP" : "*" }

+ 6 - 6
Config/StartConfig/192.168.12.112.txt

@@ -1,6 +1,6 @@
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20000 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10000 }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "192.168.12.112" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20001 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10001 }], "AppId" : 2, "AppType" : "Realm", "ServerIP" : "192.168.12.112" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20002 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10002 }], "AppId" : 3, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20003 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10003 }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20004 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10004 }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.12.112", "Port" : 20005 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.12.188", "Port" : 10005 }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20000 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10000, "Host2" : null }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20001 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10001, "Host2" : null }], "AppId" : 2, "AppType" : "Realm", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20002 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10002, "Host2" : null }], "AppId" : 3, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20003 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10003, "Host2" : null }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20004 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10004, "Host2" : null }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.12.112", "Port" : 20005 }, { "_t" : "OuterConfig", "Host" : "192.168.12.188", "Port" : 10005, "Host2" : null }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "192.168.12.112" }

+ 6 - 6
Config/StartConfig/192.168.9.182.txt

@@ -1,6 +1,6 @@
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20000 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10000 }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "192.168.9.182" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20001 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10001 }], "AppId" : 2, "AppType" : "Realm", "ServerIP" : "192.168.9.182" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20002 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10002 }], "AppId" : 3, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20003 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10003 }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20004 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10004 }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
-{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "_id" : NumberLong("96832366182402"), "Host" : "192.168.9.182", "Port" : 20005 }, { "_t" : "OuterConfig", "_id" : NumberLong("96832366182403"), "Host" : "192.168.9.182", "Port" : 10005 }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20000 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10000, "Host2" : null }], "AppId" : 1, "AppType" : "Manager", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20001 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10001, "Host2" : null }], "AppId" : 2, "AppType" : "Realm", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20002 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10002, "Host2" : null }], "AppId" : 3, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20003 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10003, "Host2" : null }], "AppId" : 4, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20004 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10004, "Host2" : null }], "AppId" : 5, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }
+{ "_t" : "StartConfig", "_id" : NumberLong("96832366182401"), "components" : [{ "_t" : "InnerConfig", "Host" : "192.168.9.182", "Port" : 20005 }, { "_t" : "OuterConfig", "Host" : "192.168.9.182", "Port" : 10005, "Host2" : null }], "AppId" : 6, "AppType" : "Gate", "ServerIP" : "192.168.9.182" }

+ 1 - 1
Config/StartConfig/LocalAllServer.txt

@@ -1 +1 @@
-{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "components" : [{ "_t" : "OuterConfig", "_id" : NumberLong("98547768819755"), "Host" : "127.0.0.1", "Port" : 10002, "Host2" : null }, { "_t" : "InnerConfig", "_id" : NumberLong("98547768819756"), "Host" : "127.0.0.1", "Port" : 20000 }, { "_t" : "HttpConfig", "_id" : NumberLong("98547768819757"), "Url" : "", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "_id" : NumberLong("98547768819758"), "ConnectionString" : null, "DBName" : null }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }
+{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "components" : [{ "_t" : "OuterConfig", "Host" : "127.0.0.1", "Port" : 10002, "Host2" : null }, { "_t" : "InnerConfig", "Host" : "127.0.0.1", "Port" : 20000 }, { "_t" : "HttpConfig", "Url" : "", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "ConnectionString" : null, "DBName" : null }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }

+ 85 - 0
Doc/组件设计.md

@@ -0,0 +1,85 @@
+# 组件设计
+
+在代码复用和组织数据方面,面向对象可能是大家第一反应。面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题。不过面向对象不是万能的,它也有极大的缺陷:
+### 1. 数据组织耦合性及强
+一旦父类中增加或删除某个字段,可能要影响到所有子类,影响到所有子类相关的逻辑。这显得非常不灵活,在一套复杂的继承体系中,往父类中改变字段会变得越来越麻烦,比方说ABC是D的子类,某天发现需要增加一个AB都有的数据,但是C没有,那么这个数据肯定不好放到父类中,只能将AB抽象出来一个父类E,E继承于D,AB共有的字段加到E中,一旦继承结构发生了变化,可能接口也要改变,比方说之前有个接口传入参数类型是E,当AB不在需要共用的那个字段,那么需要调整继承关系,让AB重新继承D,那么这个接口的传入参数类型需要改成D,其中的逻辑代码很可能也要发生调整。更可怕的是游戏逻辑变化非常复杂,非常频繁,可能今天加了个字段,明天又删掉了,假如每次都要去调整继承结构,这简直就是噩梦。继承结构面对频繁的数据结构调整感觉很无力。还有个严重的问题,继承结构无法运行时增加删除字段,比如玩家Player平常是走路,使用坐骑后就骑马。问题是坐骑的相关信息就需要一直挂在Player对象上面。这就显得很不灵活,我不骑马的时候内存中为啥要有马的数据?
+### 2. 接口逻辑难以复用,难以热插拔。
+面向对象处理相同行为所使用的方法是继承相同的父类或者接口。问题是接口并没有实现代码,而是需要其子类自己去写相关实现。很显然相同的功能,每个子类都可能写一份相似的代码。这导致接口的实现代码无法复用。还有个问题,一个类实现了一个接口,那么这个接口就永远粘在了这个类身上,你想甩掉她都不行,还是以骑马为例,玩家Player可以进行骑行,那么可能继承一个骑行的接口,问题是,当我这个Player从坐骑上下来时,玩家Player身上还是有骑行的接口,根本没法动态删掉这个接口!可能例子举得不是很对,但是道理表述的应该很清楚了。
+### 3. 使用面向对象可能导致灾难性后果
+游戏开发中有新人有老人,有技术好的,有技术差的。人都是喜欢偷懒的,当你发现调整继承关系麻烦的时候,有可能AB中增加一个字段为了省事直接就放到父类D中去了。导致C莫名奇妙的多了一个无用的字段。关键还没法发现,最后导致父类D越来越大,到最后有可能干脆就不用ABC了,直接让所有对象都变成D,方便嘛!是的,很多游戏就是这么干的,开发到最后根本就不管继承关系了,因为想管也管不了了。    
+  
+面向对象在面对复杂的游戏逻辑时会很无力,所以很多游戏开发者又倒退了回去,使用面向过程进行开发游戏,面向过程,简单粗暴,不考虑复杂的继承,不考虑抽象,不考虑多态,是开发届的freestyle,挽起袖子就开撸,但同时,代码逻辑的复用性,数据的复用性也大大降低。面向过程也不是一种好的游戏开发模式。
+
+组件模式很好的解决了面向对象以及面向过程的种种缺陷,在游戏客户端中使用非常广泛,Unity3d,虚幻4,等等都使用了组件模式。组件模式的特点:
+1.高度模块化,一个组件就是一份数据加一段逻辑
+2.组件可热插拔,需要就加上,不需要就删除
+3.类型之间依赖极少,任何类型增加或删除组件不会影响到其它类型。
+
+目前只有极少有服务端使用了组件的设计,守望先锋服务端应该是使用了组件的设计,守望先锋的开发人员称之为ECS架构,其实就是组件模式的一个变种,E就是Entity,C就是Component,S是System,其实就是将组件Component的逻辑与数据剥离,逻辑部分叫System,话题扯远了,还是回到ET框架来把。
+
+ET框架使用了组件的设计。一切都是Entity和Component,任何对象继承于Entity都可以挂载组件,例如玩家对象:
+```C#
+public sealed class Player : Entity
+{
+	public string Account { get; private set; }
+	public long UnitId { get; set; }
+	
+	public void Awake(string account)
+	{
+		this.Account = account;
+	}
+	
+	public override void Dispose()
+	{
+		if (this.Id == 0)
+		{
+			return;
+		}
+		base.Dispose();
+	}
+}
+```
+给玩家对象挂载个移动组件MoveComponent,这样玩家就可以移动了,给玩家挂上一个背包组件,玩家就可以管理物品了,给玩家挂上技能组件,那么玩家就可以施放技能了,加上Buff组件就可以管理buff了。
+```C#
+player.AddComponent<MoveComponent>();
+player.AddComponent<ItemsComponent>();
+player.AddComponent<SpellComponent>();
+player.AddComponent<BuffComponent>();
+```
+组件是高度可以复用的,比如一个NPC,他也可以移动,给NPC也挂上MoveComponent就行了,有的NPC也可以施放技能,那么给它挂上SpellComponent,NPC不需要背包,那么就不用挂ItemsComponent了
+
+ET框架模块全部做成了组件的形式,一个进程也是由不同的组件拼接而成。比方说Loginserver需要对外连接也需要与服务器内部进行连接,那么login server挂上
+```C#
+// 内网网络组件NetInnerComponent,处理对内网连接
+Game.Scene.AddComponent<NetInnerComponent, string, int>(innerConfig.Host, innerConfig.Port);
+// 外网网络组件NetOuterComponent,处理与客户端连接
+Game.Scene.AddComponent<NetOuterComponent, string, int>(outerConfig.Host, outerConfig.Port);
+```
+比如battle server就不需要对外网连接(外网消息由gateserver转发),那么很自然的只需要挂载一个内网组件即可。
+```C#
+// 内网网络组件NetInnerComponent处理对内网连接
+Game.Scene.AddComponent<NetInnerComponent, string, int>(innerConfig.Host, innerConfig.Port);
+```
+类似Unity3d的组件,ET框架也提供了组件事件,例如Awake,Start,Update等。要给一个Component或者Entity加上这些事件,必须写一个辅助类。比如NetInnerComponent组件需要Awake跟Update方法,那么添加一个这样的类即可:
+```C#
+	[ObjectEvent]
+	public class NetInnerComponentEvent : ObjectEvent<NetInnerComponent>, IAwake, IUpdate
+	{
+		public void Awake()
+		{
+			this.Get().Awake();
+		}
+
+		public void Update()
+		{
+			this.Get().Update();
+		}
+	}
+```
+这样,NetInnerComponent在AddComponent之后会调用其Awake方法,并且每帧调用Update方法。
+ET没有像Unity使用反射去实现这种功能,反射性能比较差,而且这样实现的好处是这个类可以放到热更dll中,这样组件的Awake Start,Update方法以及其它方法都可以放到热更层中。只有数据放在model层,方便热更修复逻辑bug。
+
+组件式开发最大的好处就是不管菜鸟还是高手,开发一个功能都能很快的知道怎么组织数据怎么组织逻辑。可以完全放弃面向对象。使用面向对象开发最头疼的就是我该继承哪个类呢?之前做过最恐怖的就是虚幻三,虚幻三的继承结构非常多层,完全不知道自己需要从哪里开始继承。最后可能导致一个非常小的功能,继承了一个及其巨大的类,这在虚幻三开发中屡见不鲜。所以虚幻4改用了组件模式。组件模式的模块隔离性非常好,技术菜鸟某个组件写得非常差,也不会影响到其它模块,大不了重写这个组件就好了。
+
+
+

+ 0 - 28
README

@@ -1,28 +0,0 @@
-2017-4-17: IOS il2cpp p/invoke调用有很多bug,必须修改代码绕过去,增加了安卓和ios使用的enet库,安卓和ios都测试通过,方便大家使用
-
-2017-3-30: unity升级到5.5.2,增加vs调试启动参数,很多人问我,所以加上去了。增加主线程同步上下文,mongodb异步函数就能回调到主线程
-
-2017-2-17: 使用ILRuntime提供Unity C#代码热更新支持,并且抹平了Mono层和ILRuntime层差异,使用起来风格与原来用法保持一致, 扔掉你的lua代码吧!
-
-
-ET框架:一个Unity客户端和分布式游戏服务器框架
-
-无缝大世界功能正在开发
-
-01.客户端服务端共用代码
-02.服务器使用组件设计,一切皆是组件
-03.单APP设计,各种服务器都是一个同样的App,在启动时根据命令行的AppType,不同的服务器挂载不同的逻辑组件,挂载不同的消息handler,挂载不同的配置
-04.跨平台设计,既可以在windows上跑,也可以在linux上跑,windows用vs开发方便单步调试
-05.框架支持不停服重新加载逻辑dll,也就是服务器热更新
-06.一行配置即可将所有种类服务器集中到一个进程中,开发时,只需要启动一个进程,不用再启动一堆的服务进程
-07.及其方便检查CPU占用和内存泄漏检查,vs自带分析工具,不用再为性能和内存泄漏检查而烦恼
-08.提供及其方便的网络rpc调用,使用async await语法的异步rpc
-09.使用NLog库,打log及其方便,开发时,可以将所有服务器log打到一个文件中,再也不用一个个文件搜索log了
-10.统一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,并且以后使用mongodb做数据库,再也不用做格式转换了。
-11.提供rsync同步工具,可以windows上开发测试完之后,一键同步代码到linux,linux一键编译运行
-12.提供命令行配置工具,配置分布式服务器及其简单
-
-linux工具安装命令: sudo aptitude install git-core screen cmake build-essential pkg-config
-
-Email: egametang@gmail.com
-QQ   : 80081771

+ 53 - 0
README.md

@@ -0,0 +1,53 @@
+### 1.可用VS单步调试的分布式服务端,N变1  
+一般来说,分布式服务端要启动很多进程,一旦进程多了,单步调试就变得非常困难,导致服务端开发基本上靠打log来查找问题。平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了一个个组件,启动时根据服务器类型挂载自己所需要的组件。这有点类似电脑,电脑都模块化的拆成了内存,CPU,主板等等零件,搭配不同的零件就能组装成一台不同的电脑,例如家用台式机需要内存,CPU,主板,显卡,显示器,硬盘。而公司用的服务器却不需要显示器和显卡,网吧的电脑可能不需要硬盘等。正因为这样的设计,ET框架可以将所有的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了所有服务器的功能,一个进程就可以作为整组分布式服务器使用。这也类似电脑,台式机有所有的电脑组件,那它也完全可以当作公司服务器使用,也可以当作网吧电脑。  
+### 2.随意可拆分功能的分布式服务端,1变N  
+分布式服务端要开发多种类型的服务器进程,比如Login server,gate server,battle server,chat server friend server等等一大堆各种server,传统开发方式需要预先知道当前的功能要放在哪个服务器上,当功能越来越多的时候,比如聊天功能之前在一个中心服务器上,之后需要拆出来单独做成一个服务器,这时会牵扯到大量迁移代码的工作,烦不胜烦。ET框架在平常开发的时候根本不太需要关心当前开发的这个功能会放在什么server上,只用一个进程进行开发,功能开发成组件的形式。发布的时候使用一份多进程的配置即可发布成多进程的形式,是不是很方便呢?随便你怎么拆分服务器。只需要修改极少的代码就可以进行拆分。不同的server挂上不同的组件就行了嘛!  
+### 3.跨平台的分布式服务端  
+ET框架使用C#做服务端,现在C#是完全可以跨平台的,在linux上安装mono,即可,不需要修改任何代码,就能跑起来。性能方面,因为.net已经开源,mono已经被微软收购,现在mono的性能很强,测试了,只比windows慢一点点,比lua,python什么快的多了。做游戏服务端完全不在话下。平常我们开发的时候用VS在windows上开发调试,发布的时候发布到linux上即可。ET框架还提供了一键同步工具,打开unity->tools->rsync同步,即可同步代码到linux上,  
+```bash
+./Run.sh Config/StartConfig/192.168.12.188.txt 
+```
+即可编译启动服务器。  
+### 4.提供协程支持  
+C#天生支持异步变同步语法 async和await,比lua,python的协程强大的多,新版python以及javascript语言甚至照搬了C#的协程语法。分布式服务端大量服务器之间的远程调用,没有异步语法的支持,开发将非常麻烦。所以java没有异步语法,做单服还行,不适合做大型分布式游戏服务端。例如:  
+
+```c#
+// 发送C2R_Ping并且等待响应消息R2C_Ping
+R2C_Ping pong = await session.Call<R2C_Ping>(new C2R_Ping());
+Log.Debug("收到R2C_Ping");
+
+// 向mongodb查询一个id为1的Player,并且等待返回
+Player player = await Game.Scene.GetComponent<DBProxyComponent>().Query<Player>(1);
+Log.Debug($"打印player name: {player.Name}")
+```
+可以看出,有了async await,所有的服务器间的异步操作将变得非常连贯,不用再拆成多段逻辑。大大简化了分布式服务器开发  
+### 5.提供类似erlang的actor消息机制  
+erlang语言一大优势就是位置透明的消息机制,用户完全不用关心对象在哪个进程,拿到id就可以对对象发送消息。ET框架也提供了actor消息机制,实体对象只需要挂上ActorComponent组件,这个实体对象就成了一个Actor,任何服务器只需要知道这个实体对象的id就可以向其发送消息,完全不用关心这个实体对象在哪个server,在哪台物理机器上。其实现原理也很简单,ET框架提供了一个位置服务器,所有挂载ActorComoponet的实体对象都会将自己的id跟位置注册到这个位置服务器,其它服务器向这个实体对象发送消息的时候如果不知道这个实体对象的位置,会先去位置服务器查询,查询到位置再进行发送。
+### 6.提供服务器不停服动态更新逻辑功能  
+热更是游戏服务器不可缺少的功能,ET框架使用的组件设计,可以做成守望先锋的设计,组件只有成员,无方法,将所有方法做成扩展方法放到热更dll中,运行时重新加载dll即可热更所有逻辑。
+### 7.客户端热更新一键切换  
+因为ios的限制,之前unity热更新一般使用lua,导致unity3d开发人员要写两种代码,麻烦的要死。之后幸好出了ILRuntime库,利用ILRuntime库,unity3d可以利用C#语言加载热更新dll进行热更新。ILRuntime一个缺陷就是开发时候不支持VS debug,这有点不爽。ET框架使用了一个预编译指令ILRuntime,可以无缝切换。平常开发的时候不使用ILRuntime,而是使用Assembly.Load加载热更新动态库,这样可以方便用VS单步调试。在发布的时候,定义预编译指令ILRuntime就可以无缝切换成使用ILRuntime加载热更新动态库。这样开发起来及其方便,再也不用使用狗屎lua了
+### 8.客户端服务端用同一种语言,并且共享代码  
+下载ET框架,打开服务端工程,可以看到服务端引用了客户端很多代码,通过引用客户端代码的方式实现了双端共享代码。例如客户端服务端之间的网络消息两边完全共用一个文件即可,添加一个消息只需要修改一遍。  
+### 9.UDP TCP协议无缝切换  
+ET框架不但支持TCP,而且支持可靠的UDP协议,UDP支持是封装了ENet库,ENet也是英雄联盟所使用的网络库,其特点是快速,并且网络丢包的情况下性能也非常好,这个我们做过测试TCP在丢包5%的情况下,moba游戏就卡的不行了,但是使用ENet,丢包20%仍然不会感到卡。非常强大。  
+
+### 10 还有很多很多功能,我就不详细介绍了  
+a.及其方便检查CPU占用和内存泄漏检查,vs自带分析工具,不用再为性能和内存泄漏检查而烦恼  
+b.使用NLog库,打log及其方便,平常开发时,可以将所有服务器log打到一个文件中,再也不用一个个文件搜索log了  
+c.统一使用Mongodb的bson做序列化,消息和配置文件全部都是bson或者json,并且以后使用mongodb做数据库,再也不用做格式转换了。  
+d.提供一个强大的ai行为树工具  
+e.提供一个同步工具  
+f.提供命令行配置工具,配置分布式非常简单  
+
+ET框架的服务端是一个强大灵活的分布式服务端架构,完全可以满足绝大部分大型游戏需求。使用这套框架,客户端开发者就可以自己完成双端开发,节省大量人力物力,节省大量沟通时间。  
+
+使用方法:  
+1.用git clone代码下来,安装Unity 2017.1p5 和VS2017  
+2.vs打开Unity/Unity.sln,编译  
+3.再启动一个vs打开Server/Server.sln,编译  
+4.打开Unity->tools菜单->命令行配置,选择LocalAllServer.txt 这是启动单一App的方式,如果要启动一组多App服务器,在命令行工具中选择127.0.0.1.txt,点击启动即可,具体配置都可以自己用这个命令行配置工具修改  
+5.点击工具中的启动,这样就启动了服务端(也可以用VS启动,方便单步调试)  
+7.运行Unity,输入帐号,点击登录这时日志 连接Gate成功,表示运行OK!  
+
+__讨论QQ群 : 474643097__

+ 4 - 2
Server/App/Program.cs

@@ -15,8 +15,8 @@ namespace App
 
 			try
 			{
-				ObjectEvents.Instance.Register("Model", typeof(Game).Assembly);
-				ObjectEvents.Instance.Register("Hotfix", DllHelper.GetHotfixAssembly());
+				ObjectEvents.Instance.Add("Model", typeof(Game).Assembly);
+				ObjectEvents.Instance.Add("Hotfix", DllHelper.GetHotfixAssembly());
 
 				Options options = Game.Scene.AddComponent<OptionComponent, string[]>(args).Options;
 				StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig;
@@ -91,6 +91,8 @@ namespace App
 						Game.Scene.AddComponent<AppManagerComponent>();
 						Game.Scene.AddComponent<RealmGateAddressComponent>();
 						Game.Scene.AddComponent<GateSessionKeyComponent>();
+						Game.Scene.AddComponent<ConfigComponent>();
+						Log.Debug(Game.Scene.GetComponent<ConfigComponent>().Get<BuffConfig>(1).Name);
 						break;
 					case AppType.Benchmark:
 						Game.Scene.AddComponent<NetOuterComponent>();

+ 1 - 1
Server/Hotfix/Handler/C2G_LoginGateHandler.cs

@@ -19,7 +19,7 @@ namespace Hotfix
 					reply(response);
 					return;
 				}
-				Player player = ObjectFactory.Create<Player, string>(account);
+				Player player = EntityFactory.Create<Player, string>(account);
 				Game.Scene.GetComponent<PlayerComponent>().Add(player);
 				session.AddComponent<SessionPlayerComponent>().Player = player;
 				session.AddComponent<ActorComponent, IEntityActorHandler>(new GateSessionEntityActorHandler());

+ 6 - 6
Server/Hotfix/Handler/C2R_LoginHandler.cs

@@ -11,12 +11,12 @@ namespace Hotfix
 			R2C_Login response = new R2C_Login();
 			try
 			{
-				if (message.Account != "abcdef" || message.Password != "111111")
-				{
-					response.Error = ErrorCode.ERR_AccountOrPasswordError;
-					reply(response);
-					return;
-				}
+				//if (message.Account != "abcdef" || message.Password != "111111")
+				//{
+				//	response.Error = ErrorCode.ERR_AccountOrPasswordError;
+				//	reply(response);
+				//	return;
+				//}
 
 				// 随机分配一个Gate
 				StartConfig config = Game.Scene.GetComponent<RealmGateAddressComponent>().GetAddress();

+ 36 - 0
Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using Model;
+
+namespace Hotfix
+{
+	[MessageHandler(AppType.DB)]
+	public class DBQueryBatchRequestHandler : AMRpcHandler<DBQueryBatchRequest, DBQueryBatchResponse>
+	{
+		protected override async void Run(Session session, DBQueryBatchRequest message, Action<DBQueryBatchResponse> reply)
+		{
+			DBQueryBatchResponse response = new DBQueryBatchResponse();
+			try
+			{
+				DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
+				List<Entity> entitys = await dbCacheComponent.GetBatch(message.CollectionName, message.IdList);
+
+				response.Entitys = entitys;
+
+				if (message.NeedCache)
+				{
+					foreach (Entity entity in entitys)
+					{
+						dbCacheComponent.AddToCache(entity, message.CollectionName);
+					}
+				}
+
+				reply(response);
+			}
+			catch (Exception e)
+			{
+				ReplyError(response, e, reply);
+			}
+		}
+	}
+}

+ 36 - 0
Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using Model;
+
+namespace Hotfix
+{
+	[MessageHandler(AppType.DB)]
+	public class DBQueryJsonRequestHandler : AMRpcHandler<DBQueryJsonRequest, DBQueryJsonResponse>
+	{
+		protected override async void Run(Session session, DBQueryJsonRequest message, Action<DBQueryJsonResponse> reply)
+		{
+			DBQueryJsonResponse response = new DBQueryJsonResponse();
+			try
+			{
+				DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
+				List<Entity> entitys = await dbCacheComponent.GetJson(message.CollectionName, message.Json);
+
+				response.Entitys = entitys;
+
+				if (message.NeedCache)
+				{
+					foreach (Entity entity in entitys)
+					{
+						dbCacheComponent.AddToCache(entity, message.CollectionName);
+					}
+				}
+
+				reply(response);
+			}
+			catch (Exception e)
+			{
+				ReplyError(response, e, reply);
+			}
+		}
+	}
+}

+ 32 - 0
Server/Hotfix/Handler/DBQueryRequestHandler.cs

@@ -0,0 +1,32 @@
+using System;
+using Model;
+
+namespace Hotfix
+{
+	[MessageHandler(AppType.DB)]
+	public class DBQueryRequestHandler : AMRpcHandler<DBQueryRequest, DBQueryResponse>
+	{
+		protected override async void Run(Session session, DBQueryRequest message, Action<DBQueryResponse> reply)
+		{
+			DBQueryResponse response = new DBQueryResponse();
+			try
+			{
+				DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
+				Entity entity = await dbCacheComponent.Get(message.CollectionName, message.Id);
+
+				response.Entity = entity;
+
+				if (message.NeedCache && entity != null)
+				{
+					dbCacheComponent.AddToCache(entity, message.CollectionName);
+				}
+
+				reply(response);
+			}
+			catch (Exception e)
+			{
+				ReplyError(response, e, reply);
+			}
+		}
+	}
+}

+ 39 - 0
Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs

@@ -0,0 +1,39 @@
+using System;
+using Model;
+
+namespace Hotfix
+{
+	[MessageHandler(AppType.DB)]
+	public class DBSaveBatchRequestHandler : AMRpcHandler<DBSaveBatchRequest, DBSaveBatchResponse>
+	{
+		protected override async void Run(Session session, DBSaveBatchRequest message, Action<DBSaveBatchResponse> reply)
+		{
+			DBSaveBatchResponse response = new DBSaveBatchResponse();
+			try
+			{
+				DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
+
+				if (message.CollectionName == "")
+				{
+					message.CollectionName = message.Entitys[0].GetType().Name;
+				}
+
+				if (message.NeedCache)
+				{
+					foreach (Entity entity in message.Entitys)
+					{
+						dbCacheComponent.AddToCache(entity, message.CollectionName);
+					}
+				}
+
+				await dbCacheComponent.AddBatch(message.Entitys, message.CollectionName);
+
+				reply(response);
+			}
+			catch (Exception e)
+			{
+				ReplyError(response, e, reply);
+			}
+		}
+	}
+}

+ 33 - 0
Server/Hotfix/Handler/DBSaveRequestHandler.cs

@@ -0,0 +1,33 @@
+using System;
+using Model;
+
+namespace Hotfix
+{
+	[MessageHandler(AppType.DB)]
+	public class DBSaveRequestHandler : AMRpcHandler<DBSaveRequest, DBSaveResponse>
+	{
+		protected override async void Run(Session session, DBSaveRequest message, Action<DBSaveResponse> reply)
+		{
+			DBSaveResponse response = new DBSaveResponse();
+			try
+			{
+				DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
+				if (message.CollectionName == "")
+				{
+					message.CollectionName = message.Entity.GetType().Name;
+				}
+
+				if (message.NeedCache)
+				{
+					dbCacheComponent.AddToCache(message.Entity, message.CollectionName);
+				}
+				await dbCacheComponent.Add(message.Entity, message.CollectionName);
+				reply(response);
+			}
+			catch (Exception e)
+			{
+				ReplyError(response, e, reply);
+			}
+		}
+	}
+}

+ 1 - 1
Server/Hotfix/Handler/G2M_CreateUnitHandler.cs

@@ -11,7 +11,7 @@ namespace Hotfix
 			M2G_CreateUnit response = new M2G_CreateUnit();
 			try
 			{
-				Unit unit = ObjectFactory.Create<Unit, UnitType>(UnitType.Hero);
+				Unit unit = EntityFactory.Create<Unit, UnitType>(UnitType.Hero);
 				unit.AddComponent<ActorComponent, IEntityActorHandler>(new CommonEntityActorHandler());
 				unit.AddComponent<UnitGateComponent, long>(message.GateSessionId);
 				Game.Scene.GetComponent<UnitComponent>().Add(unit);

+ 1 - 1
Server/Hotfix/Handler/M2A_ReloadHandler.cs

@@ -11,7 +11,7 @@ namespace Hotfix
 			A2M_Reload response = new A2M_Reload();
 			try
 			{
-				ObjectEvents.Instance.Register("Hotfix", DllHelper.GetHotfixAssembly());
+				ObjectEvents.Instance.Add("Hotfix", DllHelper.GetHotfixAssembly());
 				reply(response);
 			}
 			catch (Exception e)

+ 5 - 0
Server/Hotfix/Server.Hotfix.csproj

@@ -38,6 +38,11 @@
     <Compile Include="Component\RealmGateAddressComponentE.cs" />
     <Compile Include="Handler\ActorRpc_TestHandler.cs" />
     <Compile Include="Handler\Actor_TestHandler.cs" />
+    <Compile Include="Handler\DBQueryBatchRequestHandler.cs" />
+    <Compile Include="Handler\DBQueryJsonRequestHandler.cs" />
+    <Compile Include="Handler\DBQueryRequestHandler.cs" />
+    <Compile Include="Handler\DBSaveBatchRequestHandler.cs" />
+    <Compile Include="Handler\DBSaveRequestHandler.cs" />
     <Compile Include="Handler\G2M_CreateUnitHandler.cs" />
     <Compile Include="Helper\MessageHelper.cs" />
     <Compile Include="Handler\C2G_LoginGateHandler.cs" />

+ 0 - 0
Server/Model/Config/ACategory.cs → Server/Model/Base/Config/ACategory.cs


+ 0 - 0
Server/Model/Config/AConfig.cs → Server/Model/Base/Config/AConfig.cs


+ 0 - 0
Server/Model/Config/AConfigComponent.cs → Server/Model/Base/Config/AConfigComponent.cs


+ 0 - 0
Server/Model/Config/ConfigAttribute.cs → Server/Model/Base/Config/ConfigAttribute.cs


+ 3 - 3
Server/Model/Config/ConfigHelper.cs → Server/Model/Base/Config/ConfigHelper.cs

@@ -7,15 +7,15 @@ namespace Model
 	{
 		public static string GetText(string key)
 		{
-			string path = $@"../Config/{key}.txt";
+			string path = $"../Config/{key}.txt";
 			try
 			{
 				string configStr = File.ReadAllText(path);
 				return configStr;
 			}
-			catch (Exception)
+			catch (Exception e)
 			{
-				throw new Exception($"load config file fail, path: {path}");
+				throw new Exception($"load config file fail, path: {path} {e}");
 			}
 		}
 	}

+ 0 - 0
Server/Model/Config/ICategory.cs → Server/Model/Base/Config/ICategory.cs


+ 0 - 0
Server/Model/Event/AEventAttribute.cs → Server/Model/Base/Event/AEventAttribute.cs


+ 0 - 0
Server/Model/Event/Env.cs → Server/Model/Base/Event/Env.cs


+ 0 - 0
Server/Model/Event/EnvKey.cs → Server/Model/Base/Event/EnvKey.cs


+ 0 - 0
Server/Model/Event/EventAttribute.cs → Server/Model/Base/Event/EventAttribute.cs


+ 18 - 0
Server/Model/Base/Event/EventIdType.cs

@@ -0,0 +1,18 @@
+namespace Model
+{
+	public enum EventIdType
+	{
+		InitSceneStart,
+
+		BehaviorTreeRunTreeEvent,
+		BehaviorTreeOpenEditor,
+		BehaviorTreeClickNode,
+		BehaviorTreeAfterChangeNodeType,
+		BehaviorTreeCreateNode,
+		BehaviorTreePropertyDesignerNewCreateClick,
+		BehaviorTreeMouseInNode,
+		BehaviorTreeConnectState,
+		BehaviorTreeReplaceClick,
+		BehaviorTreeRightDesignerDrag,
+	}
+}

+ 0 - 0
Server/Model/Event/IEvent.cs → Server/Model/Base/Event/IEvent.cs


+ 1 - 1
Server/Model/Helper/DllHelper.cs → Server/Model/Base/Helper/DllHelper.cs

@@ -22,7 +22,7 @@ namespace Model
 		public static Type[] GetMonoTypes()
 		{
 			List<Type> types = new List<Type>();
-			foreach (Assembly assembly in ObjectEvents.Instance.GetAssemblies())
+			foreach (Assembly assembly in ObjectEvents.Instance.GetAll())
 			{
 				types.AddRange(assembly.GetTypes());
 			}

+ 0 - 0
Server/Model/Message/AActorMessage.cs → Server/Model/Base/Message/AActorMessage.cs


+ 21 - 8
Server/Model/Message/AMActorHandler.cs → Server/Model/Base/Message/AMActorHandler.cs

@@ -7,12 +7,12 @@ namespace Model
 	{
 		protected abstract Task<bool> Run(E entity, Message message);
 
-		public async Task<bool> Handle(Session session, Entity entity, AMessage msg)
+		public async Task<bool> Handle(Session session, Entity entity, ActorRequest message)
 		{
-			Message message = msg as Message;
-			if (message == null)
+			Message msg = message.AMessage as Message;
+			if (msg == null)
 			{
-				Log.Error($"消息类型转换错误: {msg.GetType().FullName} to {typeof (Message).Name}");
+				Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Message).Name}");
 				return false;
 			}
 			E e = entity as E;
@@ -21,7 +21,20 @@ namespace Model
 				Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof(E).Name}");
 				return false;
 			}
-			return await this.Run(e, message);
+
+			await this.Run(e, msg);
+
+			// 等回调回来,session可以已经断开了,所以需要判断session id是否为0
+			if (session.Id == 0)
+			{
+				return false;
+			}
+			ActorResponse response = new ActorResponse
+			{
+				RpcId = message.RpcId
+			};
+			session.Reply(response);
+			return true;
 		}
 
 		public Type GetMessageType()
@@ -42,11 +55,11 @@ namespace Model
 
 		protected abstract Task<bool> Run(E entity, Request message, Action<Response> reply);
 
-		public async Task<bool> Handle(Session session, Entity entity, AMessage message)
+		public async Task<bool> Handle(Session session, Entity entity, ActorRequest message)
 		{
 			try
 			{
-				Request request = message as Request;
+				Request request = message.AMessage as Request;
 				if (request == null)
 				{
 					Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).Name}");
@@ -65,7 +78,7 @@ namespace Model
 					{
 						return;
 					}
-					response.RpcId = request.RpcId;
+					response.RpcId = message.RpcId;
 					session.Reply(response);
 				});
 			}

+ 0 - 20
Server/Model/Message/AMHandler.cs → Server/Model/Base/Message/AMRpcHandler.cs

@@ -2,26 +2,6 @@
 
 namespace Model
 {
-	public abstract class AMHandler<Message>: IMHandler where Message : AMessage
-	{
-		protected abstract void Run(Session session, Message message);
-
-		public void Handle(Session session, AMessage msg)
-		{
-			Message message = msg as Message;
-			if (message == null)
-			{
-				Log.Error($"消息类型转换错误: {msg.GetType().Name} to {typeof (Message).Name}");
-			}
-			this.Run(session, message);
-		}
-
-		public Type GetMessageType()
-		{
-			return typeof (Message);
-		}
-	}
-
 	public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : ARequest where Response : AResponse
 	{
 		protected static void ReplyError(Response response, Exception e, Action<Response> reply)

+ 0 - 0
Server/Model/Message/AMessage.cs → Server/Model/Base/Message/AMessage.cs


+ 0 - 0
Server/Model/Message/ActorMessageAttribute.cs → Server/Model/Base/Message/ActorMessageAttribute.cs


+ 0 - 0
Server/Model/Message/ActorMessageHandlerAttribute.cs → Server/Model/Base/Message/ActorMessageHandlerAttribute.cs


+ 0 - 0
Server/Model/Message/ErrorCode.cs → Server/Model/Base/Message/ErrorCode.cs


+ 3 - 0
Server/Model/Message/IEntityActorHandler.cs → Server/Model/Base/Message/IEntityActorHandler.cs

@@ -15,6 +15,9 @@ namespace Model
 		public async Task<bool> Handle(Session session, Entity entity, ActorRequest message)
 		{
 			((Session)entity).Send(message.AMessage);
+			ActorResponse response = new ActorResponse();
+			response.RpcId = message.RpcId;
+			session.Reply(response);
 			return true;
 		}
 	}

+ 1 - 1
Server/Model/Message/IMActorHandler.cs → Server/Model/Base/Message/IMActorHandler.cs

@@ -5,7 +5,7 @@ namespace Model
 {
 	public interface IMActorHandler
 	{
-		Task<bool> Handle(Session session, Entity entity, AMessage message);
+		Task<bool> Handle(Session session, Entity entity, ActorRequest message);
 		Type GetMessageType();
 	}
 }

+ 0 - 0
Server/Model/Message/IMHandler.cs → Server/Model/Base/Message/IMHandler.cs


+ 0 - 0
Server/Model/Message/InnerMessageDispatcher.cs → Server/Model/Base/Message/InnerMessageDispatcher.cs


+ 0 - 0
Server/Model/Message/MessageAttribute.cs → Server/Model/Base/Message/MessageAttribute.cs


+ 0 - 0
Server/Model/Message/MessageHandlerAttribute.cs → Server/Model/Base/Message/MessageHandlerAttribute.cs


+ 0 - 0
Server/Model/Message/OpcodeHelper.cs → Server/Model/Base/Message/OpcodeHelper.cs


+ 0 - 0
Server/Model/Message/OuterMessageDispatcher.cs → Server/Model/Base/Message/OuterMessageDispatcher.cs


+ 0 - 0
Server/Model/Object/ComponentDB.cs → Server/Model/Base/Object/ComponentDB.cs


+ 0 - 0
Server/Model/Object/EntityType.cs → Server/Model/Base/Object/EntityType.cs


+ 3 - 3
Server/Model/Object/ObjectEvents.cs → Server/Model/Base/Object/ObjectEvents.cs

@@ -55,7 +55,7 @@ namespace Model
 		private Queue<Disposer> loaders = new Queue<Disposer>();
 		private Queue<Disposer> loaders2 = new Queue<Disposer>();
 		
-		public void Register(string name, Assembly assembly)
+		public void Add(string name, Assembly assembly)
 		{
 			this.assemblies[name] = assembly;
 
@@ -86,12 +86,12 @@ namespace Model
 			this.Load();
 		}
 
-		public Assembly GetAssembly(string name)
+		public Assembly Get(string name)
 		{
 			return this.assemblies[name];
 		}
 
-		public Assembly[] GetAssemblies()
+		public Assembly[] GetAll()
 		{
 			return this.assemblies.Values.ToArray();
 		}

+ 3 - 3
Server/Model/Component/ActorComponent.cs

@@ -55,8 +55,8 @@ namespace Model
 		
 		public async void Start()
 		{
-			this.actorId = this.Owner.Id;
-			Game.Scene.GetComponent<ActorManagerComponent>().Add(this.Owner);
+			this.actorId = this.Entity.Id;
+			Game.Scene.GetComponent<ActorManagerComponent>().Add(this.Entity);
 			await Game.Scene.GetComponent<LocationProxyComponent>().Add(this.actorId);
 			this.HandleAsync();
 		}
@@ -93,7 +93,7 @@ namespace Model
 				try
 				{
 					ActorMessageInfo info = await this.GetAsync();
-					await this.entityActorHandler.Handle(info.Session, this.Owner, info.Message);
+					await this.entityActorHandler.Handle(info.Session, this.Entity, info.Message);
 				}
 				catch (Exception e)
 				{

+ 1 - 6
Server/Model/Component/ActorMessageDispatherComponent.cs

@@ -80,12 +80,7 @@ namespace Model
 				return false;
 			}
 			
-			if (message.AMessage is ARequest request)
-			{
-				request.RpcId = message.RpcId;
-			}
-
-			return await handler.Handle(session, entity, message.AMessage);
+			return await handler.Handle(session, entity, message);
 		}
 
 		public override void Dispose()

+ 1 - 1
Server/Model/Component/ActorProxyComponent.cs

@@ -13,7 +13,7 @@ namespace Model
 				return actorProxy;
 			}
 			
-			actorProxy = ObjectFactory.CreateWithId<ActorProxy>(id);
+			actorProxy = EntityFactory.CreateWithId<ActorProxy>(id);
 			this.dictionary[id] = actorProxy;
 			return actorProxy;
 		}

+ 0 - 232
Server/Model/Component/EventComponent.cs

@@ -1,232 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace Model
-{
-	[ObjectEvent]
-	public class EventComponentEvent : ObjectEvent<EventComponent>, IAwake, ILoad
-	{
-		public void Awake()
-		{
-			this.Get().Awake();
-		}
-
-		public void Load()
-		{
-			this.Get().Load();
-		}
-	}
-
-	/// <summary>
-	/// 事件分发
-	/// </summary>
-	public class EventComponent: Component
-	{
-		private Dictionary<int, List<object>> allEvents;
-
-		public void Awake()
-		{
-			this.Load();
-		}
-
-		public void Load()
-		{
-			this.allEvents = new Dictionary<int, List<object>>();
-
-			Type[] types = DllHelper.GetMonoTypes();
-			foreach (Type type in types)
-			{
-				object[] attrs = type.GetCustomAttributes(typeof (EventAttribute), false);
-
-				foreach (object attr in attrs)
-				{
-					EventAttribute aEventAttribute = (EventAttribute) attr;
-
-					object obj = Activator.CreateInstance(type);
-					if (!this.allEvents.ContainsKey(aEventAttribute.Type))
-					{
-						this.allEvents.Add(aEventAttribute.Type, new List<object>());
-					}
-					this.allEvents[aEventAttribute.Type].Add(obj);
-				}
-			}
-		}
-
-		public void Run(int type)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					IEvent iEvent = obj as IEvent;
-					if (iEvent == null)
-					{
-						throw new Exception($"event type: {type} is not IEvent");
-					}
-					iEvent.Run();
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A>(int type, A a)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A>;
-					if (iEvent == null)
-					{
-						throw new Exception($"event type: {type} is not IEvent<{typeof (A).Name}>");
-					}
-					iEvent.Run(a);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A, B>(int type, A a, B b)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A, B>;
-					if (iEvent == null)
-					{
-						throw new Exception($"event type: {type} is not IEvent<{typeof (A).Name}, {typeof (B).Name}>");
-					}
-					iEvent.Run(a, b);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A, B, C>(int type, A a, B b, C c)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A, B, C>;
-					if (iEvent == null)
-					{
-						throw new Exception($"event type: {type} is not IEvent<{typeof (A).Name}, {typeof (B).Name}, {typeof (C).Name}>");
-					}
-					iEvent.Run(a, b, c);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A, B, C, D>(int type, A a, B b, C c, D d)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A, B, C, D>;
-					if (iEvent == null)
-					{
-						throw new Exception($"event type: {type} is not IEvent<{typeof (A).Name}, {typeof (B).Name}, {typeof (C).Name}, {typeof (D).Name}>");
-					}
-					iEvent.Run(a, b, c, d);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A, B, C, D, E>(int type, A a, B b, C c, D d, E e)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A, B, C, D, E>;
-					if (iEvent == null)
-					{
-						throw new Exception(
-								$"event type: {type} is not IEvent<{typeof (A).Name}, {typeof (B).Name}, {typeof (C).Name}, {typeof (D).Name}, {typeof (E).Name}>");
-					}
-					iEvent.Run(a, b, c, d, e);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-
-		public void Run<A, B, C, D, E, F>(int type, A a, B b, C c, D d, E e, F f)
-		{
-			if (!this.allEvents.TryGetValue(type, out List<object> iEvents))
-			{
-				return;
-			}
-
-			foreach (object obj in iEvents)
-			{
-				try
-				{
-					var iEvent = obj as IEvent<A, B, C, D, E, F>;
-					if (iEvent == null)
-					{
-						throw new Exception(
-								$"event type: {type} is not IEvent<{typeof (A).Name}, {typeof (B).Name}, {typeof (C).Name}, {typeof (D).Name}, {typeof (E).Name}>");
-					}
-					iEvent.Run(a, b, c, d, e, f);
-				}
-				catch (Exception err)
-				{
-					Log.Error(err.ToString());
-				}
-			}
-		}
-	}
-}

+ 2 - 2
Server/Model/Component/LocationComponent.cs

@@ -198,8 +198,8 @@ namespace Model
 		{
 			if (!this.lockDict.ContainsKey(key))
 			{
-				Log.Info($"location get key: {key}");
 				this.locations.TryGetValue(key, out int location);
+				Log.Info($"location get key: {key} {location}");
 				return Task.FromResult(location);
 			}
 
@@ -215,7 +215,7 @@ namespace Model
 				tasks = new Queue<LocationTask>();
 				this.taskQueues[key] = tasks;
 			}
-			task.Scene = this.GetOwner<Scene>();
+			task.Scene = this.GetEntity<Scene>();
 			tasks.Enqueue(task);
 		}
 

+ 0 - 110
Server/Model/Component/TimerComponent.cs

@@ -1,110 +0,0 @@
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Model
-{
-	[ObjectEvent]
-	public class TimerComponentEvent: ObjectEvent<TimerComponent>, IUpdate
-	{
-		public void Update()
-		{
-			this.Get().Update();
-		}
-	}
-
-	public class Timer
-	{
-		public long Id { get; set; }
-		public long Time { get; set; }
-		public TaskCompletionSource<bool> tcs;
-	}
-
-	public class TimerComponent: Component
-	{
-		private readonly Dictionary<long, Timer> timers = new Dictionary<long, Timer>();
-
-		/// <summary>
-		/// key: time, value: timer id
-		/// </summary>
-		private readonly MultiMap<long, long> timeId = new MultiMap<long, long>();
-
-		private readonly Queue<long> timeoutTimer = new Queue<long>();
-
-		public void Update()
-		{
-			long timeNow = TimeHelper.Now();
-			foreach (long time in this.timeId.Keys)
-			{
-				if (time > timeNow)
-				{
-					break;
-				}
-				this.timeoutTimer.Enqueue(time);
-			}
-
-			while (this.timeoutTimer.Count > 0)
-			{
-				long key = this.timeoutTimer.Dequeue();
-				long[] timeOutId = this.timeId.GetAll(key);
-				foreach (long id in timeOutId)
-				{
-					if (!this.timers.TryGetValue(id, out Timer timer))
-					{
-						continue;
-					}
-					this.Remove(id);
-					timer.tcs.SetResult(true);
-				}
-			}
-		}
-
-		private void Remove(long id)
-		{
-			if (!this.timers.TryGetValue(id, out Timer timer))
-			{
-				return;
-			}
-			this.timers.Remove(id);
-			this.timeId.Remove(timer.Time, timer.Id);
-		}
-
-		public Task WaitTillAsync(long tillTime, CancellationToken cancellationToken)
-		{
-			TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
-			Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = tillTime, tcs = tcs };
-			this.timers[timer.Id] = timer;
-			this.timeId.Add(timer.Time, timer.Id);
-			cancellationToken.Register(() => { this.Remove(timer.Id); });
-			return tcs.Task;
-		}
-
-		public Task WaitTillAsync(long tillTime)
-		{
-			TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
-			Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = tillTime, tcs = tcs };
-			this.timers[timer.Id] = timer;
-			this.timeId.Add(timer.Time, timer.Id);
-			return tcs.Task;
-		}
-
-		public Task WaitAsync(long time, CancellationToken cancellationToken)
-		{
-			TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
-			Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = TimeHelper.Now() + time, tcs = tcs };
-			this.timers[timer.Id] = timer;
-			this.timeId.Add(timer.Time, timer.Id);
-			cancellationToken.Register(() => { this.Remove(timer.Id); });
-			return tcs.Task;
-		}
-
-		public Task WaitAsync(long time)
-		{
-			TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
-			Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = TimeHelper.Now() + time, tcs = tcs };
-			this.timers[timer.Id] = timer;
-			this.timeId.Add(timer.Time, timer.Id);
-			return tcs.Task;
-		}
-	}
-}

+ 2 - 2
Server/Model/Component/Unit/LockComponent.cs

@@ -82,7 +82,7 @@ namespace Model
 			{
 				Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.address);
 				string serverAddress = Game.Scene.GetComponent<StartConfigComponent>().StartConfig.ServerIP;
-				G2G_LockRequest request = new G2G_LockRequest { Id = this.Owner.Id, Address = serverAddress };
+				G2G_LockRequest request = new G2G_LockRequest { Id = this.Entity.Id, Address = serverAddress };
 				await session.Call<G2G_LockResponse>(request);
 
 				this.status = LockStatus.Locked;
@@ -95,7 +95,7 @@ namespace Model
 			}
 			catch (Exception e)
 			{
-				Log.Error($"获取锁失败: {this.address} {this.Owner.Id} {e}");
+				Log.Error($"获取锁失败: {this.address} {this.Entity.Id} {e}");
 			}
 		}
 

+ 26 - 11
Server/Model/Entity/ActorProxy.cs

@@ -2,11 +2,18 @@
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
+using MongoDB.Bson.Serialization.Attributes;
 
 namespace Model
 {
 	public abstract class ActorTask
 	{
+		[BsonIgnore]
+		public ActorProxy proxy;
+
+		[BsonElement]
+		public AMessage message;
+
 		public abstract Task<AResponse> Run();
 
 		public abstract void RunFail(int error);
@@ -17,9 +24,6 @@ namespace Model
 	/// </summary>
 	public class ActorMessageTask: ActorTask
 	{
-		private readonly ActorProxy proxy;
-		private readonly AMessage message;
-
 		public ActorMessageTask(ActorProxy proxy, AMessage message)
 		{
 			this.proxy = proxy;
@@ -44,9 +48,7 @@ namespace Model
 	/// <typeparam name="Response"></typeparam>
 	public class ActorRpcTask<Response> : ActorTask where Response: AResponse
 	{
-		private readonly ActorProxy proxy;
-		private readonly ARequest message;
-
+		[BsonIgnore]
 		public readonly TaskCompletionSource<Response> Tcs = new TaskCompletionSource<Response>();
 
 		public ActorRpcTask(ActorProxy proxy, ARequest message)
@@ -102,7 +104,7 @@ namespace Model
 		public int WindowSize = 1;
 
 		// 最大窗口
-		public const int MaxWindowSize = 100;
+		public const int MaxWindowSize = 1;
 
 		private TaskCompletionSource<ActorTask> tcs;
 
@@ -131,7 +133,7 @@ namespace Model
 
 		private void Remove()
 		{
-			this.RunningTasks.Dequeue();
+			ActorTask task = this.RunningTasks.Dequeue();
 			this.AllowGet();
 		}
 
@@ -142,10 +144,12 @@ namespace Model
 				return;
 			}
 
-			var t = this.tcs;
-			this.tcs = null;
+
 			ActorTask task = this.WaitingTasks.Dequeue();
 			this.RunningTasks.Enqueue(task);
+
+			var t = this.tcs;
+			this.tcs = null;
 			t.SetResult(task);
 		}
 
@@ -157,7 +161,7 @@ namespace Model
 				this.RunningTasks.Enqueue(task);
 				return Task.FromResult(task);
 			}
-
+			
 			this.tcs = new TaskCompletionSource<ActorTask>();
 			return this.tcs.Task;
 		}
@@ -247,6 +251,7 @@ namespace Model
 		{
 			try
 			{
+				//Log.Debug($"realcall {MongoHelper.ToJson(request)} {this.Address}");
 				request.Id = this.Id;
 				Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.Address);
 				Response response = await session.Call<Response>(request, cancellationToken);
@@ -259,6 +264,16 @@ namespace Model
 			}
 		}
 
+		public string DebugQueue(Queue<ActorTask> tasks)
+		{
+			string s = "";
+			foreach (ActorTask task in tasks)
+			{
+				s += $" {task.message.GetType().Name}";
+			}
+			return s;
+		}
+
 		public override void Dispose()
 		{
 			if (this.Id == 0)

+ 1 - 1
Server/Model/Entity/Config/BuffConfig.cs

@@ -6,7 +6,7 @@ namespace Model
 	public class BuffConfig: AConfig
 	{
 		public string Name { get; set; }
-		public int Time { get; set; }
+		public int Duration { get; set; }
 
 		public BuffConfig()
 		{

+ 3 - 3
Server/Model/Entity/DBEntity.cs → Server/Model/Entity/EntityDB.cs

@@ -6,13 +6,13 @@ namespace Model
 	[BsonKnownTypes(typeof(RechargeRecord))]
 	[BsonKnownTypes(typeof(Recharge))]
 	[BsonKnownTypes(typeof(Location))]
-	public class DBEntity: Entity
+	public class EntityDB: Entity
 	{
-		protected DBEntity()
+		protected EntityDB()
 		{
 		}
 
-		protected DBEntity(long id): base(id)
+		protected EntityDB(long id): base(id)
 		{
 		}
 	}

+ 2 - 2
Server/Model/Entity/Http.cs

@@ -1,7 +1,7 @@
 namespace Model
 {
 	// 充值流水
-	public sealed class RechargeRecord : DBEntity
+	public sealed class RechargeRecord : EntityDB
 	{
 		// 充值玩家
 		public int PlayerNO { get; set; }
@@ -18,7 +18,7 @@
 	}
 
 	// 保存玩家充值记录, 每个玩家只有一条
-	public sealed class Recharge : DBEntity
+	public sealed class Recharge : EntityDB
 	{
 		public int CardNumber { get; set; }
 		

+ 1 - 1
Server/Model/Entity/Location.cs

@@ -1,6 +1,6 @@
 namespace Model
 {
-	public class Location: DBEntity
+	public class Location: EntityDB
 	{
 		public string Address;
 

+ 0 - 247
Server/Model/Entity/Session.cs

@@ -1,247 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Model
-{
-	public sealed class Session : Entity
-	{
-		private static uint RpcId { get; set; }
-		private readonly NetworkComponent network;
-		private readonly Dictionary<uint, Action<object>> requestCallback = new Dictionary<uint, Action<object>>();
-		private readonly AChannel channel;
-
-		public Session(NetworkComponent network, AChannel channel)
-		{
-			this.network = network;
-			this.channel = channel;
-			this.StartRecv();
-		}
-
-		public string RemoteAddress
-		{
-			get
-			{
-				return this.channel.RemoteAddress;
-			}
-		}
-
-		public ChannelType ChannelType
-		{
-			get
-			{
-				return this.channel.ChannelType;
-			}
-		}
-
-		private async void StartRecv()
-		{
-			while (true)
-			{
-				if (this.Id == 0)
-				{
-					return;
-				}
-
-				byte[] messageBytes;
-				try
-				{
-					messageBytes = await channel.Recv();
-					if (this.Id == 0)
-					{
-						return;
-					}
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-					continue;
-				}
-
-				if (messageBytes.Length < 3)
-				{
-					continue;
-				}
-
-				ushort opcode = BitConverter.ToUInt16(messageBytes, 0);
-				opcode = NetworkHelper.NetworkToHostOrder(opcode);
-				try
-				{
-					this.Run(opcode, messageBytes);
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-				}
-			}
-		}
-
-		private void Run(ushort opcode, byte[] messageBytes)
-		{
-			int offset = 0;
-			byte flag = messageBytes[2];
-
-			bool isCompressed = (flag & 0x80) > 0;
-			const int opcodeAndFlagLength = 3;
-			if (isCompressed) // 最高位为1,表示有压缩,需要解压缩
-			{
-				messageBytes = ZipHelper.Decompress(messageBytes, opcodeAndFlagLength, messageBytes.Length - opcodeAndFlagLength);
-				offset = 0;
-			}
-			else
-			{
-				offset = opcodeAndFlagLength;
-			}
-
-			this.RunDecompressedBytes(opcode, messageBytes, offset);
-		}
-
-		private void RunDecompressedBytes(ushort opcode, byte[] messageBytes, int offset)
-		{
-			Type messageType = this.network.Owner.GetComponent<OpcodeTypeComponent>().GetType(opcode);
-			object message = this.network.MessagePacker.DeserializeFrom(messageType, messageBytes, offset, messageBytes.Length - offset);
-
-			AResponse response = message as AResponse;
-			if (response != null)
-			{
-				// rpcFlag>0 表示这是一个rpc响应消息
-				// Rpc回调有找不着的可能,因为client可能取消Rpc调用
-				Action<object> action;
-				if (!this.requestCallback.TryGetValue(response.RpcId, out action))
-				{
-					return;
-				}
-				this.requestCallback.Remove(response.RpcId);
-				action(message);
-				return;
-			}
-
-			this.network.MessageDispatcher.Dispatch(this, opcode, offset, messageBytes, (AMessage)message);
-		}
-
-		/// <summary>
-		/// Rpc调用
-		/// </summary>
-		public Task<Response> Call<Response>(ARequest request, CancellationToken cancellationToken)
-			where Response : AResponse
-		{
-			request.RpcId = ++RpcId;
-			//Log.Debug($"{request.GetType().FullName} {request.RpcId}");
-			this.SendMessage(request);
-
-			var tcs = new TaskCompletionSource<Response>();
-
-			this.requestCallback[RpcId] = (message) =>
-			{
-				try
-				{
-					Response response = (Response)message;
-					if (response.Error > 100)
-					{
-						tcs.SetException(new RpcException(response.Error, response.Message));
-						return;
-					}
-					//Log.Debug($"recv: {MongoHelper.ToJson(response)}");
-					tcs.SetResult(response);
-				}
-				catch (Exception e)
-				{
-					tcs.SetException(new Exception($"Rpc Error: {typeof(Response).FullName}", e));
-				}
-			};
-
-			cancellationToken.Register(() => { this.requestCallback.Remove(RpcId); });
-
-			return tcs.Task;
-		}
-
-		/// <summary>
-		/// Rpc调用,发送一个消息,等待返回一个消息
-		/// </summary>
-		public Task<Response> Call<Response>(ARequest request) where Response : AResponse
-		{
-			request.RpcId = ++RpcId;
-			this.SendMessage(request);
-
-			var tcs = new TaskCompletionSource<Response>();
-			this.requestCallback[RpcId] = (message) =>
-			{
-				try
-				{
-					Response response = (Response)message;
-					if (response.Error > 100)
-					{
-						tcs.SetException(new RpcException(response.Error, response.Message));
-						return;
-					}
-					//Log.Debug($"recv: {response.ToJson()}");
-					tcs.SetResult(response);
-				}
-				catch (Exception e)
-				{
-					tcs.SetException(new Exception($"Rpc Error: {typeof(Response).FullName}", e));
-				}
-			};
-
-			return tcs.Task;
-		}
-
-		public void Send<Message>(Message message) where Message : AMessage
-		{
-			if (this.Id == 0)
-			{
-				throw new Exception("session已经被Dispose了");
-			}
-			this.SendMessage(message);
-		}
-
-		public void Reply<Response>(Response message) where Response : AResponse
-		{
-			if (this.Id == 0)
-			{
-				throw new Exception("session已经被Dispose了");
-			}
-			this.SendMessage(message);
-		}
-
-		private void SendMessage(object message)
-		{
-			//Log.Debug($"send: {message.ToJson()}");
-			ushort opcode = this.network.Owner.GetComponent<OpcodeTypeComponent>().GetOpcode(message.GetType());
-			opcode = NetworkHelper.HostToNetworkOrder(opcode);
-			byte[] opcodeBytes = BitConverter.GetBytes(opcode);
-
-			byte[] messageBytes = this.network.MessagePacker.SerializeToByteArray(message);
-			byte flag = 0;
-			if (messageBytes.Length > 100)
-			{
-				byte[] newMessageBytes = ZipHelper.Compress(messageBytes);
-				if (newMessageBytes.Length < messageBytes.Length)
-				{
-					messageBytes = newMessageBytes;
-					flag |= 0x80;
-				}
-			}
-
-			byte[] flagBytes = { flag };
-
-			channel.Send(new List<byte[]> { opcodeBytes, flagBytes, messageBytes });
-		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-
-			long id = this.Id;
-
-			base.Dispose();
-
-			this.channel.Dispose();
-			this.network.Remove(id);
-		}
-	}
-}

+ 0 - 18
Server/Model/Event/EventIdType.cs

@@ -1,18 +0,0 @@
-namespace Model
-{
-	public static class EventIdType
-	{
-		public const int InitSceneStart = 1;
-
-		public const int BehaviorTreeRunTreeEvent = 2;
-		public const int BehaviorTreeOpenEditor = 3;
-		public const int BehaviorTreeClickNode = 4;
-		public const int BehaviorTreeAfterChangeNodeType = 5;
-		public const int BehaviorTreeCreateNode = 6;
-		public const int BehaviorTreePropertyDesignerNewCreateClick = 7;
-		public const int BehaviorTreeMouseInNode = 8;
-		public const int BehaviorTreeConnectState = 9;
-		public const int BehaviorTreeReplaceClick = 10;
-		public const int BehaviorTreeRightDesignerDrag = 11;
-	}
-}

+ 0 - 43
Server/Model/Message/AppType.cs

@@ -1,43 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace Model
-{
-	[Flags]
-	public enum AppType
-	{
-		None = 0,
-		Manager = 1,
-		Realm = 1 << 1,
-		Gate = 1 << 2,
-		Http = 1 << 3,
-		DB = 1 << 4,
-		Location = 1 << 5,
-		Map = 1 << 6,
-
-		Robot = 1 << 29,
-		Benchmark = 1 << 30,
-		Client = 1 << 31,
-
-		// 7
-		AllServer = Manager | Realm | Gate | Http | DB | Location | Map
-	}
-
-	public static class AppTypeHelper
-	{
-		public static List<AppType> GetServerTypes()
-		{
-			List<AppType> appTypes = new List<AppType> { AppType.Manager, AppType.Realm, AppType.Gate };
-			return appTypes;
-		}
-
-		public static bool Is(this AppType a, AppType b)
-		{
-			if ((a & b) != 0)
-			{
-				return true;
-			}
-			return false;
-		}
-	}
-}

+ 0 - 7
Server/Model/Message/IMessageDispatcher.cs

@@ -1,7 +0,0 @@
-namespace Model
-{
-	public interface IMessageDispatcher
-	{
-		void Dispatch(Session session, ushort opcode, int offset, byte[] messageBytes, AMessage message);
-	}
-}

+ 0 - 18
Server/Model/Message/IMessagePacker.cs

@@ -1,18 +0,0 @@
-using System;
-
-namespace Model
-{
-	public interface IMessagePacker
-	{
-		byte[] SerializeToByteArray(object obj);
-		string SerializeToText(object obj);
-
-		object DeserializeFrom(Type type, byte[] bytes);
-		object DeserializeFrom(Type type, byte[] bytes, int index, int count);
-		T DeserializeFrom<T>(byte[] bytes);
-		T DeserializeFrom<T>(byte[] bytes, int index, int count);
-
-		T DeserializeFrom<T>(string str);
-		object DeserializeFrom(Type type, string str);
-	}
-}

+ 0 - 23
Server/Model/Message/RpcException.cs

@@ -1,23 +0,0 @@
-using System;
-
-namespace Model
-{
-	/// <summary>
-	/// RPC异常,带ErrorCode
-	/// </summary>
-	[Serializable]
-	public class RpcException: Exception
-	{
-		public int Error { get; private set; }
-
-		public RpcException(int error, string message): base($"Error: {error} Message: {message}")
-		{
-			this.Error = error;
-		}
-
-		public RpcException(int error, string message, Exception e): base($"Error: {error} Message: {message}", e)
-		{
-			this.Error = error;
-		}
-	}
-}

+ 0 - 51
Server/Model/Object/Component.cs

@@ -1,51 +0,0 @@
-using MongoDB.Bson.Serialization.Attributes;
-
-namespace Model
-{
-	[BsonKnownTypes(typeof(ComponentDB))]
-	public abstract class Component: Disposer
-	{
-		[BsonIgnore]
-		public Entity Owner { get; set; }
-
-		public T GetOwner<T>() where T : Entity
-		{
-			return this.Owner as T;
-		}
-
-		protected Component()
-		{
-		}
-
-		protected Component(long id): base(id)
-		{
-		}
-
-		public T GetComponent<T>() where T : Component
-		{
-			return this.Owner.GetComponent<T>();
-		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-
-			base.Dispose();
-
-			if (this.Owner.Id != 0)
-			{
-				this.Owner?.RemoveComponent(this.GetType());
-			}
-		}
-
-		public override void EndInit()
-		{
-			base.EndInit();
-
-			ObjectEvents.Instance.Add(this);
-		}
-	}
-}

+ 0 - 30
Server/Model/Object/Disposer.cs

@@ -1,30 +0,0 @@
-using System;
-
-namespace Model
-{
-	public abstract class Disposer: Object, IDisposable
-	{
-		protected Disposer(): base(IdGenerater.GenerateId())
-		{
-			ObjectEvents.Instance.Add(this);
-		}
-
-		protected Disposer(long id): base(id)
-		{
-			ObjectEvents.Instance.Add(this);
-		}
-
-		public virtual void Dispose()
-		{
-			this.Id = 0;
-		}
-
-		public override void BeginInit()
-		{
-		}
-
-		public override void EndInit()
-		{
-		}
-	}
-}

+ 0 - 215
Server/Model/Object/Entity.cs

@@ -1,215 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using MongoDB.Bson.Serialization.Attributes;
-
-namespace Model
-{
-	public class Entity: Disposer
-	{
-		[BsonIgnore]
-		public Entity Parent { get; set; }
-
-		public EntityType Type { get; set; }
-
-		[BsonElement]
-		[BsonIgnoreIfNull]
-		private HashSet<Component> components = new HashSet<Component>();
-
-		[BsonIgnore]
-		private Dictionary<Type, Component> componentDict = new Dictionary<Type, Component>();
-
-		protected Entity()
-		{
-		}
-
-		protected Entity(long id): base(id)
-		{
-		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-
-			base.Dispose();
-
-			foreach (Component component in this.GetComponents())
-			{
-				try
-				{
-					component.Dispose();
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-				}
-			}
-		}
-
-		public K AddComponent<K>() where K : Component, new()
-		{
-			K component = ObjectFactory.Create<K>();
-			component.Owner = this;
-
-			if (this.componentDict.ContainsKey(component.GetType()))
-			{
-				throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof (K).Name}");
-			}
-
-			if (this.components == null)
-			{
-				this.components = new HashSet<Component>();
-			}
-
-			if (component is ComponentDB)
-			{
-				this.components.Add(component);
-			}
-			this.componentDict.Add(component.GetType(), component);
-			return component;
-		}
-
-		public K AddComponent<K, P1>(P1 p1) where K : Component, new()
-		{
-			K component = ObjectFactory.Create<K, P1>(p1);
-			component.Owner = this;
-
-			if (this.componentDict.ContainsKey(component.GetType()))
-			{
-				throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof (K).Name}");
-			}
-
-			if (this.components == null)
-			{
-				this.components = new HashSet<Component>();
-			}
-
-			if (component is ComponentDB)
-			{
-				this.components.Add(component);
-			}
-			this.componentDict.Add(component.GetType(), component);
-			return component;
-		}
-
-		public K AddComponent<K, P1, P2>(P1 p1, P2 p2) where K : Component, new()
-		{
-			K component = ObjectFactory.Create<K, P1, P2>(p1, p2);
-			component.Owner = this;
-
-			if (this.componentDict.ContainsKey(component.GetType()))
-			{
-				throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof (K).Name}");
-			}
-
-			if (this.components == null)
-			{
-				this.components = new HashSet<Component>();
-			}
-
-			if (component is ComponentDB)
-			{
-				this.components.Add(component);
-			}
-			this.componentDict.Add(component.GetType(), component);
-			return component;
-		}
-
-		public K AddComponent<K, P1, P2, P3>(P1 p1, P2 p2, P3 p3) where K : Component, new()
-		{
-			K component = ObjectFactory.Create<K, P1, P2, P3>(p1, p2, p3);
-			component.Owner = this;
-
-			if (this.componentDict.ContainsKey(component.GetType()))
-			{
-				throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {typeof (K).Name}");
-			}
-
-			if (this.components == null)
-			{
-				this.components = new HashSet<Component>();
-			}
-
-			if (component is ComponentDB)
-			{
-				this.components.Add(component);
-			}
-			this.componentDict.Add(component.GetType(), component);
-			return component;
-		}
-
-		public void RemoveComponent<K>() where K : Component
-		{
-			if (!this.componentDict.TryGetValue(typeof(K), out Component component))
-			{
-				return;
-			}
-
-			this.components.Remove(component);
-			this.componentDict.Remove(typeof (K));
-			if (this.components.Count == 0)
-			{
-				this.components = null;
-			}
-			component.Dispose();
-		}
-
-		public void RemoveComponent(Type type)
-		{
-			if (!this.componentDict.TryGetValue(type, out Component component))
-			{
-				return;
-			}
-
-			this.components.Remove(component);
-			this.componentDict.Remove(type);
-			if (this.components.Count == 0)
-			{
-				this.components = null;
-			}
-			component.Dispose();
-		}
-
-		public K GetComponent<K>() where K : Component
-		{
-			if (!this.componentDict.TryGetValue(typeof(K), out Component component))
-			{
-				return default(K);
-			}
-			return (K) component;
-		}
-
-		public Component[] GetComponents()
-		{
-			return this.componentDict.Values.ToArray();
-		}
-
-		public override void BeginInit()
-		{
-			base.BeginInit();
-			this.components = new HashSet<Component>();
-			this.componentDict = new Dictionary<Type, Component>();
-		}
-
-		public override void EndInit()
-		{
-			base.EndInit();
-
-			ObjectEvents.Instance.Add(this);
-
-			if (this.components.Count == 0)
-			{
-				this.components = null;
-				return;
-			}
-			foreach (Component component in this.components)
-			{
-				component.Owner = this;
-				this.componentDict.Add(component.GetType(), component);
-			}
-		}
-	}
-}

+ 0 - 22
Server/Model/Object/IAwake.cs

@@ -1,22 +0,0 @@
-namespace Model
-{
-	public interface IAwake
-	{
-		void Awake();
-	}
-
-	public interface IAwake<A>
-	{
-		void Awake(A a);
-	}
-
-	public interface IAwake<A, B>
-	{
-		void Awake(A a, B b);
-	}
-
-	public interface IAwake<A, B, C>
-	{
-		void Awake(A a, B b, C c);
-	}
-}

+ 0 - 7
Server/Model/Object/ILoad.cs

@@ -1,7 +0,0 @@
-namespace Model
-{
-	public interface ILoad
-	{
-		void Load();
-	}
-}

+ 0 - 7
Server/Model/Object/IUpdate.cs

@@ -1,7 +0,0 @@
-namespace Model
-{
-	public interface IUpdate
-	{
-		void Update();
-	}
-}

+ 0 - 42
Server/Model/Object/Object.cs

@@ -1,42 +0,0 @@
-using System;
-using System.ComponentModel;
-using MongoDB.Bson;
-using MongoDB.Bson.Serialization.Attributes;
-
-namespace Model
-{
-	public abstract class Object: ISupportInitialize, ICloneable
-	{
-		[BsonId]
-		[BsonIgnoreIfDefault]
-		public long Id { get; set; }
-
-		protected Object()
-		{
-			Id = IdGenerater.GenerateId();
-		}
-
-		protected Object(long id)
-		{
-			this.Id = id;
-		}
-
-		public virtual void BeginInit()
-		{
-		}
-
-		public virtual void EndInit()
-		{
-		}
-
-		public override string ToString()
-		{
-			return this.ToJson();
-		}
-
-		public object Clone()
-		{
-			return MongoHelper.FromBson(this.GetType(), this.ToBson());
-		}
-	}
-}

+ 0 - 9
Server/Model/Object/ObjectEventAttribute.cs

@@ -1,9 +0,0 @@
-using System;
-
-namespace Model
-{
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
-	public class ObjectEventAttribute: Attribute
-	{
-	}
-}

+ 92 - 50
Server/Model/Server.Model.csproj

@@ -52,6 +52,18 @@
     <Reference Include="System.Numerics" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\AMHandler.cs">
+      <Link>Message\AMHandler.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\AppType.cs">
+      <Link>Message\AppType.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\IMessageDispatcher.cs">
+      <Link>Message\IMessageDispatcher.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\IMessagePacker.cs">
+      <Link>Message\IMessagePacker.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\JsondotnetPacker.cs">
       <Link>Message\JsondotnetPacker.cs</Link>
     </Compile>
@@ -61,15 +73,63 @@
     <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\ProtobufPacker.cs">
       <Link>Message\ProtobufPacker.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Message\RpcException.cs">
+      <Link>Message\RpcException.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\Component.cs">
+      <Link>Object\Component.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\ComponentFactory.cs">
+      <Link>Object\ComponentFactory.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\Disposer.cs">
+      <Link>Object\Disposer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\Entity.cs">
+      <Link>Object\Entity.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\EntityFactory.cs">
+      <Link>Object\EntityFactory.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\IAwake.cs">
+      <Link>Object\IAwake.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\ILoad.cs">
+      <Link>Object\ILoad.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\IStart.cs">
+      <Link>Object\IStart.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\IUpdate.cs">
+      <Link>Object\IUpdate.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\Object.cs">
+      <Link>Object\Object.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Base\Object\ObjectEventAttribute.cs">
+      <Link>Object\ObjectEventAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Component\ConfigComponent.cs">
+      <Link>Component\ConfigComponent.cs</Link>
+    </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Component\EventComponent.cs">
+      <Link>Component\EventComponent.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Component\NetworkComponent.cs">
       <Link>Component\NetworkComponent.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Component\TimerComponent.cs">
+      <Link>Component\TimerComponent.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Entity\Message\Opcode.cs">
       <Link>Entity\Message\Opcode.cs</Link>
     </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Entity\Message\OuterMessage.cs">
       <Link>Entity\Message\OuterMessage.cs</Link>
     </Compile>
+    <Compile Include="..\..\Unity\Assets\Scripts\Entity\Session.cs">
+      <Link>Entity\Session.cs</Link>
+    </Compile>
     <Compile Include="..\..\Unity\Assets\Scripts\Helper\MongoHelper.cs">
       <Link>Helper\MongoHelper.cs</Link>
     </Compile>
@@ -78,12 +138,11 @@
     <Compile Include="Component\Unit\UnitGateComponent.cs" />
     <Compile Include="Entity\Player.cs" />
     <Compile Include="Entity\Location.cs" />
-    <Compile Include="Helper\ObjectFactory.cs" />
-    <Compile Include="Message\IEntityActorHandler.cs" />
+    <Compile Include="Base\Message\AMRpcHandler.cs" />
+    <Compile Include="Base\Message\IEntityActorHandler.cs" />
     <Compile Include="Component\OpcodeTypeComponent.cs" />
     <Compile Include="Component\ActorManagerComponent.cs" />
     <Compile Include="Component\BenchmarkComponent.cs" />
-    <Compile Include="Component\ConfigComponent.cs" />
     <Compile Include="Component\Config\ClientConfig.cs" />
     <Compile Include="Component\Config\DBConfig.cs" />
     <Compile Include="Component\Config\HttpConfig.cs" />
@@ -92,7 +151,6 @@
     <Compile Include="Component\DBCacheComponent.cs" />
     <Compile Include="Component\DBComponent.cs" />
     <Compile Include="Component\DBProxyComponent.cs" />
-    <Compile Include="Component\EventComponent.cs" />
     <Compile Include="Component\KVComponent.cs" />
     <Compile Include="Component\LocationProxyComponent.cs" />
     <Compile Include="Component\ActorMessageDispatherComponent.cs" />
@@ -101,7 +159,6 @@
     <Compile Include="Component\NetOuterComponent.cs" />
     <Compile Include="Component\RobotComponent.cs" />
     <Compile Include="Component\Session\SessionPlayerComponent.cs" />
-    <Compile Include="Component\TimerComponent.cs" />
     <Compile Include="Component\LocationComponent.cs" />
     <Compile Include="Component\ActorComponent.cs" />
     <Compile Include="Component\UnitComponent.cs" />
@@ -113,17 +170,17 @@
     <Compile Include="Component\RealmGateAddressComponent.cs" />
     <Compile Include="Component\OptionComponent.cs" />
     <Compile Include="Component\StartConfigComponent.cs" />
-    <Compile Include="Config\ACategory.cs" />
-    <Compile Include="Config\AConfig.cs" />
-    <Compile Include="Config\AConfigComponent.cs" />
-    <Compile Include="Config\ConfigAttribute.cs" />
-    <Compile Include="Config\ConfigHelper.cs" />
-    <Compile Include="Config\ICategory.cs" />
+    <Compile Include="Base\Config\ACategory.cs" />
+    <Compile Include="Base\Config\AConfig.cs" />
+    <Compile Include="Base\Config\AConfigComponent.cs" />
+    <Compile Include="Base\Config\ConfigAttribute.cs" />
+    <Compile Include="Base\Config\ConfigHelper.cs" />
+    <Compile Include="Base\Config\ICategory.cs" />
     <Compile Include="Entity\Config\BuffConfig.cs" />
     <Compile Include="Entity\Config\StartConfig.cs" />
     <Compile Include="Entity\ActorProxy.cs" />
     <Compile Include="Entity\SceneEntity.cs" />
-    <Compile Include="Entity\DBEntity.cs" />
+    <Compile Include="Entity\EntityDB.cs" />
     <Compile Include="Entity\DBTask.cs" />
     <Compile Include="Entity\DBTaskQueue.cs" />
     <Compile Include="Entity\Game.cs" />
@@ -131,45 +188,30 @@
     <Compile Include="Entity\Message\InnerMessage.cs" />
     <Compile Include="Entity\Message\InnerOpcode.cs" />
     <Compile Include="Entity\Scene.cs" />
-    <Compile Include="Entity\Session.cs" />
     <Compile Include="Entity\Unit.cs" />
-    <Compile Include="Event\AEventAttribute.cs" />
-    <Compile Include="Event\Env.cs" />
-    <Compile Include="Event\EnvKey.cs" />
-    <Compile Include="Event\EventAttribute.cs" />
-    <Compile Include="Event\EventIdType.cs" />
-    <Compile Include="Event\IEvent.cs" />
-    <Compile Include="Helper\DllHelper.cs" />
-    <Compile Include="Message\AActorMessage.cs" />
-    <Compile Include="Message\AMessage.cs" />
-    <Compile Include="Message\AMActorHandler.cs" />
-    <Compile Include="Message\AMHandler.cs" />
-    <Compile Include="Message\AppType.cs" />
-    <Compile Include="Message\ErrorCode.cs" />
-    <Compile Include="Message\IMActorHandler.cs" />
-    <Compile Include="Message\OuterMessageDispatcher.cs" />
-    <Compile Include="Message\InnerMessageDispatcher.cs" />
-    <Compile Include="Message\IMessageDispatcher.cs" />
-    <Compile Include="Message\IMHandler.cs" />
-    <Compile Include="Message\ActorMessageAttribute.cs" />
-    <Compile Include="Message\MessageAttribute.cs" />
-    <Compile Include="Message\ActorMessageHandlerAttribute.cs" />
-    <Compile Include="Message\MessageHandlerAttribute.cs" />
-    <Compile Include="Message\OpcodeHelper.cs" />
-    <Compile Include="Message\RpcException.cs" />
-    <Compile Include="Object\ComponentDB.cs" />
-    <Compile Include="Object\Component.cs" />
-    <Compile Include="Object\Disposer.cs" />
-    <Compile Include="Object\Entity.cs" />
-    <Compile Include="Object\IAwake.cs" />
-    <Compile Include="Object\ILoad.cs" />
-    <Compile Include="Object\IStart.cs" />
-    <Compile Include="Object\IUpdate.cs" />
-    <Compile Include="Object\ObjectEventAttribute.cs" />
-    <Compile Include="Object\EntityType.cs" />
-    <Compile Include="Object\Object.cs" />
-    <Compile Include="Object\ObjectEvents.cs" />
-    <Compile Include="Message\IMessagePacker.cs" />
+    <Compile Include="Base\Event\AEventAttribute.cs" />
+    <Compile Include="Base\Event\Env.cs" />
+    <Compile Include="Base\Event\EnvKey.cs" />
+    <Compile Include="Base\Event\EventAttribute.cs" />
+    <Compile Include="Base\Event\EventIdType.cs" />
+    <Compile Include="Base\Event\IEvent.cs" />
+    <Compile Include="Base\Helper\DllHelper.cs" />
+    <Compile Include="Base\Message\AActorMessage.cs" />
+    <Compile Include="Base\Message\AMessage.cs" />
+    <Compile Include="Base\Message\AMActorHandler.cs" />
+    <Compile Include="Base\Message\ErrorCode.cs" />
+    <Compile Include="Base\Message\IMActorHandler.cs" />
+    <Compile Include="Base\Message\OuterMessageDispatcher.cs" />
+    <Compile Include="Base\Message\InnerMessageDispatcher.cs" />
+    <Compile Include="Base\Message\IMHandler.cs" />
+    <Compile Include="Base\Message\ActorMessageAttribute.cs" />
+    <Compile Include="Base\Message\MessageAttribute.cs" />
+    <Compile Include="Base\Message\ActorMessageHandlerAttribute.cs" />
+    <Compile Include="Base\Message\MessageHandlerAttribute.cs" />
+    <Compile Include="Base\Message\OpcodeHelper.cs" />
+    <Compile Include="Base\Object\ComponentDB.cs" />
+    <Compile Include="Base\Object\EntityType.cs" />
+    <Compile Include="Base\Object\ObjectEvents.cs" />
     <Compile Include="Other\OneThreadSynchronizationContext.cs" />
     <Compile Include="Other\Options.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

+ 6 - 0
Server/Model/Server.Model.csproj.user

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>

+ 0 - 1174
Unity/Assets/Bundles/UI/Lobby.prefab

@@ -1,1174 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1001 &100100000
-Prefab:
-  m_ObjectHideFlags: 1
-  serializedVersion: 2
-  m_Modification:
-    m_TransformParent: {fileID: 0}
-    m_Modifications: []
-    m_RemovedComponents: []
-  m_ParentPrefab: {fileID: 0}
-  m_RootGameObject: {fileID: 1000012140906046}
-  m_IsPrefabParent: 1
---- !u!1 &1000010279990180
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000013306138686}
-  - 222: {fileID: 222000011260852292}
-  - 114: {fileID: 114000010075827648}
-  m_Layer: 5
-  m_Name: Return
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000010282139360
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000014261888288}
-  - 222: {fileID: 222000013767965188}
-  - 114: {fileID: 114000013938780624}
-  - 114: {fileID: 114000011352581290}
-  m_Layer: 5
-  m_Name: JoinRoom
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000010654722068
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000013995298894}
-  - 222: {fileID: 222000012286557312}
-  - 114: {fileID: 114000010390865150}
-  - 114: {fileID: 114000012431845190}
-  m_Layer: 5
-  m_Name: CreateRoom
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000010768706392
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000011127377422}
-  - 222: {fileID: 222000013477738492}
-  - 114: {fileID: 114000010018025894}
-  m_Layer: 5
-  m_Name: NameText
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000011046193616
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000014161230184}
-  m_Layer: 5
-  m_Name: Top
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000011264437648
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000010483783062}
-  - 222: {fileID: 222000013340801768}
-  - 114: {fileID: 114000012146228554}
-  m_Layer: 5
-  m_Name: NameBackground
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000011265503640
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000012493826100}
-  - 222: {fileID: 222000011891353488}
-  - 114: {fileID: 114000013049634718}
-  m_Layer: 5
-  m_Name: Gold
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000011463022836
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000012987451432}
-  - 222: {fileID: 222000014108952078}
-  - 114: {fileID: 114000013879378286}
-  m_Layer: 5
-  m_Name: Message
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000011988625458
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000013013133024}
-  - 222: {fileID: 222000010502849886}
-  - 114: {fileID: 114000010861932684}
-  m_Layer: 5
-  m_Name: More
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000012140906046
-GameObject:
-  m_ObjectHideFlags: 0
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000011433140006}
-  - 222: {fileID: 222000012393644854}
-  - 114: {fileID: 114000012430220302}
-  - 114: {fileID: 114000011231987512}
-  - 114: {fileID: 114000010131133460}
-  m_Layer: 5
-  m_Name: Lobby
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000012273643160
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000012832612498}
-  - 222: {fileID: 222000012472650716}
-  - 114: {fileID: 114000014225496034}
-  m_Layer: 5
-  m_Name: Kefu
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000013234089386
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000011685909774}
-  - 222: {fileID: 222000011206635248}
-  - 114: {fileID: 114000010640523976}
-  m_Layer: 5
-  m_Name: TouXiang
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000013273220736
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000010797904966}
-  - 222: {fileID: 222000010352788246}
-  - 114: {fileID: 114000010748204300}
-  - 114: {fileID: 114000012242520322}
-  m_Layer: 5
-  m_Name: ChongZhi
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000013579230402
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000012180277534}
-  - 222: {fileID: 222000011102980374}
-  - 114: {fileID: 114000012921558084}
-  m_Layer: 5
-  m_Name: BaoShi
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!1 &1000014196117232
-GameObject:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  serializedVersion: 4
-  m_Component:
-  - 224: {fileID: 224000012899174416}
-  - 222: {fileID: 222000012435440532}
-  - 114: {fileID: 114000013580934710}
-  m_Layer: 5
-  m_Name: Setting
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &114000010018025894
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010768706392}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_FontData:
-    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
-    m_FontSize: 14
-    m_FontStyle: 0
-    m_BestFit: 0
-    m_MinSize: 10
-    m_MaxSize: 40
-    m_Alignment: 4
-    m_AlignByGeometry: 0
-    m_RichText: 1
-    m_HorizontalOverflow: 0
-    m_VerticalOverflow: 0
-    m_LineSpacing: 1
-  m_Text: New Text
---- !u!114 &114000010075827648
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010279990180}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: bcf5a192069e38542b8c1cd35b1fe323, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000010131133460
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012140906046}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 92184f0259e287441a0abea0928c2057, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  CreateBT: {fileID: 1000012987241756, guid: 5dfe2c32bf2efc044a7f3f57c34ab334, type: 2}
---- !u!114 &114000010390865150
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010654722068}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: dcf85c2c02c070840ad89c01ff585fee, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000010640523976
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013234089386}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 947920d233348974a8cd50a4b8d8ddbb, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000010748204300
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013273220736}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 4ad538720a369ac42af17ac58ff8fc8f, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000010861932684
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011988625458}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: ab5ce638ab9b84d40a60c476e4307323, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000011231987512
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012140906046}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 502d8cafd6a5a0447ab1db9a24cdcb10, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  data:
-  - key: CreateRoom
-    gameObject: {fileID: 1000010654722068}
-  - key: JoinRoom
-    gameObject: {fileID: 1000010282139360}
---- !u!114 &114000011352581290
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010282139360}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 114000013938780624}
-  m_OnClick:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
---- !u!114 &114000012146228554
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011264437648}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: b25933244996151439a4138f5ecd44a9, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000012242520322
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013273220736}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 114000010748204300}
-  m_OnClick:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
---- !u!114 &114000012430220302
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012140906046}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 0.392}
-  m_RaycastTarget: 0
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 310c3376e6a94304f9348de3e3591d4b, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000012431845190
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010654722068}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 114000010390865150}
-  m_OnClick:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
---- !u!114 &114000012921558084
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013579230402}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 78f8e9d7ac314424a8d1472310240f59, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000013049634718
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011265503640}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 771f3bcab43a15c41a5a932faf5e0845, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000013580934710
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000014196117232}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: fb93f0536483525498b6ff6dc25f6475, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000013879378286
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011463022836}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 90684046d60017b4f8f46be35cab853a, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000013938780624
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010282139360}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: 09f10c2eecc124145bccba1947baeea1, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!114 &114000014225496034
-MonoBehaviour:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012273643160}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 21300000, guid: d40bfa065c6fb4241950116f7efbe756, type: 3}
-  m_Type: 0
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
---- !u!222 &222000010352788246
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013273220736}
---- !u!222 &222000010502849886
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011988625458}
---- !u!222 &222000011102980374
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013579230402}
---- !u!222 &222000011206635248
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013234089386}
---- !u!222 &222000011260852292
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010279990180}
---- !u!222 &222000011891353488
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011265503640}
---- !u!222 &222000012286557312
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010654722068}
---- !u!222 &222000012393644854
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012140906046}
---- !u!222 &222000012435440532
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000014196117232}
---- !u!222 &222000012472650716
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012273643160}
---- !u!222 &222000013340801768
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011264437648}
---- !u!222 &222000013477738492
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010768706392}
---- !u!222 &222000013767965188
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010282139360}
---- !u!222 &222000014108952078
-CanvasRenderer:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011463022836}
---- !u!224 &224000010483783062
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011264437648}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 9.350306}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children:
-  - {fileID: 224000011127377422}
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 8
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: -825, y: 383}
-  m_SizeDelta: {x: 122, y: 33}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000010797904966
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013273220736}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 0.9999999}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000012493826100}
-  m_RootOrder: 0
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0.795, y: 0.04}
-  m_SizeDelta: {x: 0.7, y: 0.32}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000011127377422
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010768706392}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000010483783062}
-  m_RootOrder: 0
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 1.14, y: 0.31}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000011433140006
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012140906046}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children:
-  - {fileID: 224000013995298894}
-  - {fileID: 224000014261888288}
-  - {fileID: 224000014161230184}
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_AnchorMin: {x: 0, y: 0}
-  m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 0, y: 0}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000011685909774
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013234089386}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 9.3503065}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 3
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: -824.99994, y: 467}
-  m_SizeDelta: {x: 76, y: 76}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000012180277534
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000013579230402}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 7
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: -164, y: 463}
-  m_SizeDelta: {x: 172, y: 48}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000012493826100
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011265503640}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children:
-  - {fileID: 224000010797904966}
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 6
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: -555, y: 467}
-  m_SizeDelta: {x: 242, y: 48}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000012832612498
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000012273643160}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 2
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 506, y: 456}
-  m_SizeDelta: {x: 76, y: 71}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000012899174416
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000014196117232}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 0
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 146, y: 455}
-  m_SizeDelta: {x: 76, y: 71}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000012987451432
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011463022836}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 1
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 321.99997, y: 456}
-  m_SizeDelta: {x: 76, y: 71}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000013013133024
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011988625458}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 4
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 684, y: 455}
-  m_SizeDelta: {x: 76, y: 71}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000013306138686
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010279990180}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 9.350306}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000014161230184}
-  m_RootOrder: 5
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 866, y: 459}
-  m_SizeDelta: {x: 76, y: 71}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000013995298894
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010654722068}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000011433140006}
-  m_RootOrder: 0
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: -345, y: -7}
-  m_SizeDelta: {x: 289, y: 392}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000014161230184
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000011046193616}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children:
-  - {fileID: 224000012899174416}
-  - {fileID: 224000012987451432}
-  - {fileID: 224000012832612498}
-  - {fileID: 224000011685909774}
-  - {fileID: 224000013013133024}
-  - {fileID: 224000013306138686}
-  - {fileID: 224000012493826100}
-  - {fileID: 224000012180277534}
-  - {fileID: 224000010483783062}
-  m_Father: {fileID: 224000011433140006}
-  m_RootOrder: 2
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 100, y: 100}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!224 &224000014261888288
-RectTransform:
-  m_ObjectHideFlags: 1
-  m_PrefabParentObject: {fileID: 0}
-  m_PrefabInternal: {fileID: 100100000}
-  m_GameObject: {fileID: 1000010282139360}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1.5, y: 1.5000001, z: 1}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_Children: []
-  m_Father: {fileID: 224000011433140006}
-  m_RootOrder: 1
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 344, y: 0}
-  m_SizeDelta: {x: 289, y: 392}
-  m_Pivot: {x: 0.5, y: 0.5}

+ 0 - 8
Unity/Assets/Bundles/UI/Lobby.prefab.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: ff8cd026c365b524ca9429d49f88f14d
-timeCreated: 1487236049
-licenseType: Pro
-NativeFormatImporter:
-  userData: 
-  assetBundleName: uilobby.unity3d
-  assetBundleVariant: 

+ 865 - 0
Unity/Assets/Bundles/UI/UILogin.prefab

@@ -0,0 +1,865 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+  m_ObjectHideFlags: 1
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 0}
+    m_Modifications: []
+    m_RemovedComponents: []
+  m_ParentPrefab: {fileID: 0}
+  m_RootGameObject: {fileID: 1386170326414932}
+  m_IsPrefabParent: 1
+--- !u!1 &1023474203466346
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224073640819989714}
+  - component: {fileID: 222413101418373256}
+  - component: {fileID: 114822005217712104}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1291824300971018
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224489797947042478}
+  - component: {fileID: 222930300238766398}
+  - component: {fileID: 114761152647636742}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1386170326414932
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224438795553994780}
+  - component: {fileID: 222767206446386334}
+  - component: {fileID: 114768094896805158}
+  - component: {fileID: 114699130285514482}
+  - component: {fileID: 114850350457908736}
+  m_Layer: 5
+  m_Name: UILogin
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1531376669843916
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224898347010869264}
+  - component: {fileID: 222026127576226558}
+  - component: {fileID: 114969748100432940}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1568484768885604
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224944102343361862}
+  - component: {fileID: 222162039596540310}
+  - component: {fileID: 114107327146574444}
+  - component: {fileID: 114663064108016614}
+  m_Layer: 5
+  m_Name: Password
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1670632076201042
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224922312697997914}
+  - component: {fileID: 222749306122254412}
+  - component: {fileID: 114899069937167200}
+  - component: {fileID: 114341495829030012}
+  m_Layer: 5
+  m_Name: Account
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1889707553944926
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224326499099698408}
+  - component: {fileID: 222924007153509080}
+  - component: {fileID: 114633694004432610}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1910298475376026
+GameObject:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224608071536574582}
+  - component: {fileID: 222577866995156442}
+  - component: {fileID: 114882975747376550}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!1 &1920061237828514
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  serializedVersion: 5
+  m_Component:
+  - component: {fileID: 224532636050568724}
+  - component: {fileID: 222002149542603454}
+  - component: {fileID: 114719520540637998}
+  - component: {fileID: 114630311973242952}
+  m_Layer: 5
+  m_Name: LoginBtn
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &114107327146574444
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1568484768885604}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114341495829030012
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1670632076201042}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 575553740, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 114899069937167200}
+  m_TextComponent: {fileID: 114761152647636742}
+  m_Placeholder: {fileID: 114969748100432940}
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_CharacterValidation: 0
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: 
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+--- !u!114 &114630311973242952
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1920061237828514}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 114719520540637998}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+--- !u!114 &114633694004432610
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1889707553944926}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u767B\u5F55"
+--- !u!114 &114663064108016614
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1568484768885604}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 575553740, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 114107327146574444}
+  m_TextComponent: {fileID: 114822005217712104}
+  m_Placeholder: {fileID: 114882975747376550}
+  m_ContentType: 7
+  m_InputType: 2
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_CharacterValidation: 0
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: 
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+--- !u!114 &114699130285514482
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1386170326414932}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8347f75bbf20473292de676504ad7398, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  CanvasName: LoginCanvas
+--- !u!114 &114719520540637998
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1920061237828514}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114761152647636742
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1291824300971018}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 0
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: 
+--- !u!114 &114768094896805158
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1386170326414932}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0, g: 0, b: 0, a: 0.392}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114822005217712104
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1023474203466346}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 0
+    m_HorizontalOverflow: 1
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: 
+--- !u!114 &114850350457908736
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1386170326414932}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 502d8cafd6a5a0447ab1db9a24cdcb10, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  data:
+  - key: LoginBtn
+    gameObject: {fileID: 1920061237828514}
+  - key: Account
+    gameObject: {fileID: 1670632076201042}
+  - key: Password
+    gameObject: {fileID: 1568484768885604}
+--- !u!114 &114882975747376550
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1910298475376026}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 2
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u8BF7\u8F93\u5165\u5BC6\u7801"
+--- !u!114 &114899069937167200
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1670632076201042}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+--- !u!114 &114969748100432940
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1531376669843916}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 2
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u8BF7\u8F93\u5165\u5E10\u53F7"
+--- !u!222 &222002149542603454
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1920061237828514}
+--- !u!222 &222026127576226558
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1531376669843916}
+--- !u!222 &222162039596540310
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1568484768885604}
+--- !u!222 &222413101418373256
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1023474203466346}
+--- !u!222 &222577866995156442
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1910298475376026}
+--- !u!222 &222749306122254412
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1670632076201042}
+--- !u!222 &222767206446386334
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1386170326414932}
+--- !u!222 &222924007153509080
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1889707553944926}
+--- !u!222 &222930300238766398
+CanvasRenderer:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1291824300971018}
+--- !u!224 &224073640819989714
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1023474203466346}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224944102343361862}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224326499099698408
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1889707553944926}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224532636050568724}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224438795553994780
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1386170326414932}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 224922312697997914}
+  - {fileID: 224944102343361862}
+  - {fileID: 224532636050568724}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224489797947042478
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1291824300971018}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224922312697997914}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224532636050568724
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1920061237828514}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 224326499099698408}
+  m_Father: {fileID: 224438795553994780}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -1, y: -33}
+  m_SizeDelta: {x: 263.5, y: 62.3}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224608071536574582
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1910298475376026}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224944102343361862}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224898347010869264
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1531376669843916}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224922312697997914}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224922312697997914
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1670632076201042}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 224898347010869264}
+  - {fileID: 224489797947042478}
+  m_Father: {fileID: 224438795553994780}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -1.0001, y: 99}
+  m_SizeDelta: {x: 263.5, y: 43.4}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!224 &224944102343361862
+RectTransform:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 1568484768885604}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.9999976, y: 0.9999976, z: 0.9999976}
+  m_Children:
+  - {fileID: 224608071536574582}
+  - {fileID: 224073640819989714}
+  m_Father: {fileID: 224438795553994780}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -1.0001, y: 38}
+  m_SizeDelta: {x: 263.5, y: 43.4}
+  m_Pivot: {x: 0.5, y: 0.5}

+ 9 - 0
Unity/Assets/Bundles/UI/UILogin.prefab.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 9f6d9adc6f537764fa0fea29671e77bf
+timeCreated: 1504164637
+licenseType: Free
+NativeFormatImporter:
+  mainObjectFileID: 100100000
+  userData: 
+  assetBundleName: uilogin.unity3d
+  assetBundleVariant: 

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor.meta

@@ -1,7 +1,7 @@
 fileFormatVersion: 2
 guid: 3a5857cabaf3b664fb4305495ee65ae8
 folderAsset: yes
-timeCreated: 1498181747
+timeCreated: 1505098710
 licenseType: Free
 DefaultImporter:
   userData: 

+ 3 - 2
Unity/Assets/Editor/BehaviorTreeEditor/BTEditor.cs

@@ -39,8 +39,8 @@ namespace MyEditor
 					return instance;
 				}
 
-				AssemblyManager.Instance.Add("Model", typeof(Init).Assembly);
-				AssemblyManager.Instance.Add("Editor", typeof(BTEditor).Assembly);
+				ObjectEvents.Instance.Add("Model", typeof(Init).Assembly);
+				ObjectEvents.Instance.Add("Editor", typeof(BTEditor).Assembly);
 
 				instance = new BTEditor();
 
@@ -55,6 +55,7 @@ namespace MyEditor
 
 		public static void Reset()
 		{
+			instance?.Dispose();
 			instance = null;
 		}
 

+ 18 - 9
Unity/Assets/Editor/BehaviorTreeEditor/BTEditorWindow.cs

@@ -1,5 +1,4 @@
-using System;
-using UnityEditor;
+using UnityEditor;
 using UnityEngine;
 
 namespace MyEditor
@@ -9,17 +8,11 @@ namespace MyEditor
 		CreateNode,
 		ReplaceNode
 	}
-
-	public class MessageBoxArgs: EventArgs
-	{
-		public string msg;
-	}
-
+	
 	public class BTEditorWindow: EditorWindow
 	{
 		private PropertyDesigner propDesigner;
 		private BehaviorTreeNodeClassPopup popUpMenu;
-
 		public GraphDesigner GraphDesigner { get; private set; }
 
 		public static BTEditorWindow Instance
@@ -164,5 +157,21 @@ namespace MyEditor
 		{
 			//       mRightDesigner.onDraggingBorder(deltaX);
 		}
+
+		private void OnSelectionChange()
+		{
+			GameObject[] selectedGameObjects = Selection.gameObjects;
+			if (selectedGameObjects.Length == 0)
+			{
+				return;
+			}
+			string[] ss = selectedGameObjects[0].name.Split('@');
+			if (ss.Length < 2)
+			{
+				return;
+			}
+			long id = long.Parse(ss[1]);
+			BTEditor.Instance.GetComponent<BTDebugComponent>().OwnerId = id;
+		}
 	}
 }

+ 11 - 8
Unity/Assets/Editor/BehaviorTreeEditor/BehaviorTreeNodeClassPopup.cs

@@ -63,7 +63,7 @@ namespace MyEditor
 
 			GUILayout.BeginArea(new Rect(0, 0, windowRect.width, windowRect.height));
 			float topSpace = 60;
-			this.mTreeScrollPos = GUI.BeginScrollView(new Rect(0f, topSpace, windowRect.width, windowRect.height - topSpace), this.mTreeScrollPos,
+            mTreeScrollPos = GUI.BeginScrollView(new Rect(0f, topSpace, windowRect.width, windowRect.height - topSpace), mTreeScrollPos,
 			                                          new Rect(0f, 0f, windowRect.width - 20f, nodeNameList.Count * 19), false, true);
 
 			foreach (string name in nodeNameList)
@@ -136,13 +136,16 @@ namespace MyEditor
 		
 		public GUIStyle GetButtonStyle()
 		{
-			GUIStyle style = new GUIStyle();
-			style.fontSize = 15;
-			style.alignment = TextAnchor.MiddleLeft;
-			GUIStyleState onHoverStyleState = new GUIStyleState();
-			//onHoverStyleState.textColor = textHighLightColor;
-			onHoverStyleState.background = BTDesignerUtility.GetTexture("blue");
-			style.hover = onHoverStyleState;
+            GUIStyle style = new GUIStyle()
+            {
+                fontSize = 15,
+                alignment = TextAnchor.MiddleLeft
+            };
+            GUIStyleState onHoverStyleState = new GUIStyleState()
+            {
+                background = BTDesignerUtility.GetTexture("blue")
+            };
+            style.hover = onHoverStyleState;
 
 			GUIStyleState onNormalStyleState = new GUIStyleState();
 			//onNormalStyleState.textColor = textColor;

+ 34 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Component/BTDebugComponent.cs

@@ -5,8 +5,41 @@ namespace MyEditor
 {
 	public class BTDebugComponent: Component
 	{
+		public long OwnerId;
+		public bool IsFrameSelected = false;
 		public List<List<long>> TreePathList = new List<List<long>>();
 
-		public BehaviorTree BehaviorTree { get; set; }
+		public Dictionary<long, List<List<long>>> DictPathList = new Dictionary<long, List<List<long>>>();
+
+		public void Add(long id, List<long> list)
+		{
+			this.TreePathList.Add(list);
+			if (id != 0)
+			{
+				List<List<long>> lst;
+				if (!this.DictPathList.TryGetValue(id, out lst))
+				{
+					lst = new List<List<long>>();
+					this.DictPathList.Add(id, lst);
+				}
+				lst.Add(list);
+			}
+		}
+
+		public List<List<long>> Get(long id)
+		{
+			if (id == 0)
+			{
+				return this.TreePathList;
+			}
+
+			return this.DictPathList[id];
+		}
+
+		public void Clear()
+		{
+			this.TreePathList.Clear();
+			this.DictPathList.Clear();
+		}
 	}
 }

+ 10 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Component/BTNodeInfoComponent.cs

@@ -4,7 +4,16 @@ using Model;
 
 namespace MyEditor
 {
-	public class BTNodeInfoComponent : Component, IAwake
+	[ObjectEvent]
+	public class BTNodeInfoComponentEvent : ObjectEvent<BTNodeInfoComponent>, IAwake
+	{
+		public void Awake()
+		{
+			this.Get().Awake();
+		}
+	}
+
+	public class BTNodeInfoComponent : Component
 	{
 		private Dictionary<string, NodeMeta> nameNodeMetas = new Dictionary<string, NodeMeta>(); //节点类型 name索引
 		private Dictionary<string, List<NodeMeta>> classifyNodeMetas { get; } = new Dictionary<string, List<NodeMeta>>();

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeAfterChangeNodeTypeEvent_SelectNode.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeAfterChangeNodeType)]
+	[Event((int)EventIdType.BehaviorTreeAfterChangeNodeType)]
 	public class BehaviorTreeAfterChangeNodeTypeEvent_SelectNode: IEvent
 	{
 		public void Run()

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeClickNodeEvent_SelectNode.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeClickNode)]
+	[Event((int)EventIdType.BehaviorTreeClickNode)]
 	public class BehaviorTreeClickNodeEvent_SelectNode: IEvent<NodeDesigner>
 	{
 		public void Run(NodeDesigner dstNode)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeConnectStateEvent_HandleConnectLines.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeConnectState)]
+	[Event((int)EventIdType.BehaviorTreeConnectState)]
 	public class BehaviorTreeConnectStateEvent_HandleConnectLines: IEvent<NodeDesigner, State>
 	{
 		public void Run(NodeDesigner nodeDesigner, State state)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeCreateNodeEvent_SelectNode.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeCreateNode)]
+	[Event((int)EventIdType.BehaviorTreeCreateNode)]
 	public class BehaviorTreeCreateNodeEvent_SelectNode: IEvent<NodeDesigner>
 	{
 		public void Run(NodeDesigner dstNode)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeMouseInNodeEvent_HandleOperate.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeMouseInNode)]
+	[Event((int)EventIdType.BehaviorTreeMouseInNode)]
 	public class BehaviorTreeMouseInNodeEvent_HandleOperate: IEvent<BehaviorNodeData, NodeDesigner>
 	{
 		public void Run(BehaviorNodeData nodeData, NodeDesigner nodeDesigner)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeNewCreateClickEvent_CreateNode.cs

@@ -3,7 +3,7 @@ using UnityEngine;
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreePropertyDesignerNewCreateClick)]
+	[Event((int)EventIdType.BehaviorTreePropertyDesignerNewCreateClick)]
 	public class BehaviorTreeNewCreateClickEvent_CreateNode: IEvent<string, Vector2>
 	{
 		public void Run(string name, Vector2 pos)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeOpenEditorEvent_SelectNode.cs

@@ -3,7 +3,7 @@ using UnityEngine;
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeOpenEditor)]
+	[Event((int)EventIdType.BehaviorTreeOpenEditor)]
 	public class BehaviorTreeOpenEditorEvent_SelectNode: IEvent
 	{
 		public void Run()

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeOpenEditorEvent_UpdatePropList.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeOpenEditor)]
+	[Event((int)EventIdType.BehaviorTreeOpenEditor)]
 	public class BehaviorTreeOpenEditorEvent_UpdatePropList: IEvent
 	{
 		public void Run()

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeReplaceClickEvent_ReplaceNode.cs

@@ -3,7 +3,7 @@ using UnityEngine;
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeReplaceClick)]
+	[Event((int)EventIdType.BehaviorTreeReplaceClick)]
 	public class BehaviorTreeReplaceClickEvent_ReplaceNode: IEvent<string, Vector2>
 	{
 		public void Run(string name, Vector2 pos)

+ 1 - 1
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeRightDesignerDragEvent_ModifyRightBorder.cs

@@ -2,7 +2,7 @@
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeRightDesignerDrag)]
+	[Event((int)EventIdType.BehaviorTreeRightDesignerDrag)]
 	public class BehaviorTreeRightDesignerDragEvent_ModifyRightBorder: IEvent<float>
 	{
 		public void Run(float deltaX)

+ 22 - 7
Unity/Assets/Editor/BehaviorTreeEditor/Event/BehaviorTreeRunTreeEvent_ShowDebugInfo.cs

@@ -3,17 +3,32 @@ using Model;
 
 namespace MyEditor
 {
-	[Event(EventIdType.BehaviorTreeRunTreeEvent)]
-	public class BehaviorTreeRunTreeEvent_ShowDebugInfo: IEvent<BehaviorTree, List<long>>
+	[Event((int)EventIdType.BehaviorTreeRunTreeEvent)]
+	public class BehaviorTreeRunTreeEvent_ShowDebugInfo: IEvent<BehaviorTree>
 	{
-		public void Run(BehaviorTree tree, List<long> pathList)
+		public void Run(BehaviorTree tree)
 		{
-			if (BTEditor.Instance.BehaviorTreeConfig != null)
+			if (BTEditor.Instance.CurTreeGO == null)
+			{
+				return;
+			}
+			if (BTEditor.Instance.CurTreeGO.GetInstanceID() != tree.GameObjectId)
+			{
+				return;
+			}
+			
+			BTDebugComponent btDebugComponent = BTEditor.Instance.GetComponent<BTDebugComponent>();
+
+			if (btDebugComponent.OwnerId != 0 && tree.Id != 0 && btDebugComponent.OwnerId != tree.Id)
+			{
+				return;
+			}
+
+			btDebugComponent.Add(tree.Id, tree.PathList);
+			if (!btDebugComponent.IsFrameSelected)
 			{
 				BTEditor.Instance.ClearDebugState();
-				BTEditor.Instance.GetComponent<BTDebugComponent>().TreePathList.Add(pathList);
-				BTEditor.Instance.GetComponent<BTDebugComponent>().BehaviorTree = tree;
-				BTEditor.Instance.SetDebugState(pathList);
+				BTEditor.Instance.SetDebugState(tree.PathList);
 			}
 		}
 	}

+ 19 - 8
Unity/Assets/Editor/BehaviorTreeEditor/PropertyDesigner.cs

@@ -704,27 +704,38 @@ namespace MyEditor
 
 		public void DrawDebugView()
 		{
-			BehaviorTree behaviorTree = BTEditor.Instance.GetComponent<BTDebugComponent>().BehaviorTree;
-			List<List<long>> treePathList = BTEditor.Instance.GetComponent<BTDebugComponent>().TreePathList;
-			if (behaviorTree == null)
-			{
-				return;
-			}
+			BTDebugComponent btDebugComponent = BTEditor.Instance.GetComponent<BTDebugComponent>();
+			List<List<long>> treePathList = btDebugComponent.Get(btDebugComponent.OwnerId);
+			GUILayout.BeginHorizontal();
+			GUILayout.Label("行为树Id:");
+			btDebugComponent.OwnerId = EditorGUILayout.LongField(btDebugComponent.OwnerId);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal();
 			if (GUILayout.Button("清空执行记录"))
 			{
 				treePathList.Clear();
 				BTEditor.Instance.ClearDebugState();
 			}
+
+			if (GUILayout.Button("清除帧选择"))
+			{
+				btDebugComponent.IsFrameSelected = false;
+			}
+			GUILayout.EndHorizontal();
+
 			const float offset = 55f;
-			GUILayout.BeginArea(new Rect(0f, 20f, this.mWidth, Screen.height - offset));
+			GUILayout.BeginArea(new Rect(0f, 60f, this.mWidth, Screen.height - offset));
 			this.mTreeScrollPos = GUI.BeginScrollView(
 				new Rect(0f, 0f, this.mWidth, Screen.height - offset), this.mTreeScrollPos,
 			    new Rect(0f, 0f, this.mWidth - 20f, treePathList.Count * 22), false, false);
 
-			for (int i = 0; i < BTEditor.Instance.GetComponent<BTDebugComponent>().TreePathList.Count; i++)
+			
+			for (int i = 0; i < treePathList.Count; i++)
 			{
 				if (GUILayout.Button($"frame{i}"))
 				{
+					btDebugComponent.IsFrameSelected = true;
 					BTEditor.Instance.ClearDebugState();
 					BTEditor.Instance.SetDebugState(treePathList[i]);
 				}

Некоторые файлы не были показаны из-за большого количества измененных файлов