C2G_EnterMapHandler.cs 1.4 KB

123456789101112131415161718192021222324252627282930
  1. using System;
  2. namespace ET.Server
  3. {
  4. [MessageHandler(SceneType.Game)]
  5. public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
  6. {
  7. protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
  8. {
  9. Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
  10. // 在Game上动态创建一个Map Scene,把Unit从DB中加载放进来,然后传送到真正的Map中,这样登陆跟传送的逻辑就完全一样了
  11. GameMapComponent gateMapComponent = player.AddComponent<GameMapComponent>();
  12. gateMapComponent.Scene = await SceneFactory.CreateServerScene(gateMapComponent, player.Id, IdGenerater.Instance.GenerateInstanceId(), gateMapComponent.DomainZone(), "GateMap", SceneType.Map);
  13. Scene scene = gateMapComponent.Scene;
  14. // 这里可以从DB中加载Unit
  15. Unit unit = UnitFactory.Create(scene, player.Id, UnitType.Player);
  16. unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
  17. StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Map1");
  18. response.MyId = player.Id;
  19. reply();
  20. // 等到一帧的最后面再传送,先让G2C_EnterMap返回,否则传送消息可能比G2C_EnterMap还早
  21. TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.InstanceId, startSceneConfig.Name).Coroutine();
  22. }
  23. }
  24. }