ActorLocationSenderSystem.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. namespace ET
  3. {
  4. [ObjectSystem]
  5. public class ActorLocationSenderAwakeSystem: AwakeSystem<ActorLocationSender>
  6. {
  7. public override void Awake(ActorLocationSender self)
  8. {
  9. self.LastSendOrRecvTime = TimeHelper.Now();
  10. self.FailTimes = 0;
  11. self.ActorId = 0;
  12. StartAsync(self).Coroutine();
  13. }
  14. public async ETVoid StartAsync(ActorLocationSender self)
  15. {
  16. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.ActorLocationSender, self.Id))
  17. {
  18. self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
  19. }
  20. }
  21. }
  22. [ObjectSystem]
  23. public class ActorLocationSenderDestroySystem: DestroySystem<ActorLocationSender>
  24. {
  25. public override void Destroy(ActorLocationSender self)
  26. {
  27. Log.Debug($"actor location remove: {self.Id}");
  28. self.LastSendOrRecvTime = 0;
  29. self.ActorId = 0;
  30. self.FailTimes = 0;
  31. }
  32. }
  33. public static class ActorLocationSenderHelper
  34. {
  35. private static async ETTask<IActorResponse> Run(this ActorLocationSender self, IActorRequest iActorRequest)
  36. {
  37. long instanceId = self.InstanceId;
  38. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.ActorLocationSender, self.Id))
  39. {
  40. if (self.InstanceId != instanceId)
  41. {
  42. throw new RpcException(ErrorCode.ERR_ActorRemove, $"{MongoHelper.ToJson(iActorRequest)}");
  43. }
  44. return await self.RunInner(iActorRequest);
  45. }
  46. }
  47. private static async ETTask<IActorResponse> RunInner(this ActorLocationSender self, IActorRequest iActorRequest)
  48. {
  49. try
  50. {
  51. if (self.ActorId == 0)
  52. {
  53. Log.Info($"actor send message fail, actorid: {self.Id}");
  54. self.Dispose();
  55. return new ActorResponse() { Error = ErrorCode.ERR_ActorNotOnline };
  56. }
  57. self.LastSendOrRecvTime = TimeHelper.Now();
  58. IActorResponse response = await ActorMessageSenderComponent.Instance.CallWithoutException(self.ActorId, iActorRequest);
  59. switch (response.Error)
  60. {
  61. case ErrorCode.ERR_NotFoundActor:
  62. {
  63. // 如果没找到Actor,重试
  64. ++self.FailTimes;
  65. if (self.FailTimes > ActorLocationSender.MaxFailTimes)
  66. {
  67. Log.Info($"actor send message fail, actorid: {self.Id}");
  68. self.Dispose();
  69. return response;
  70. }
  71. // 等待0.5s再发送
  72. long instanceId = self.InstanceId;
  73. await TimerComponent.Instance.WaitAsync(500);
  74. if (self.InstanceId != instanceId)
  75. {
  76. throw new RpcException(ErrorCode.ERR_ActorRemove, $"{MongoHelper.ToJson(iActorRequest)}");
  77. }
  78. self.ActorId = await LocationProxyComponent.Instance.Get(self.Id);
  79. return await self.RunInner(iActorRequest);
  80. }
  81. }
  82. self.LastSendOrRecvTime = TimeHelper.Now();
  83. self.FailTimes = 0;
  84. return response;
  85. }
  86. catch (RpcException)
  87. {
  88. self.Dispose();
  89. throw;
  90. }
  91. catch (Exception e)
  92. {
  93. self.Dispose();
  94. throw new Exception($"{MongoHelper.ToJson(iActorRequest)}\n{e}");
  95. }
  96. }
  97. public static void Send(this ActorLocationSender self, IActorLocationMessage request)
  98. {
  99. if (request == null)
  100. {
  101. throw new Exception($"actor location send message is null");
  102. }
  103. self.Run(request).Coroutine();
  104. }
  105. public static async ETTask<IActorResponse> Call(this ActorLocationSender self, IActorLocationRequest request)
  106. {
  107. if (request == null)
  108. {
  109. throw new Exception($"actor location call message is null");
  110. }
  111. return await self.Run(request);
  112. }
  113. }
  114. }