UnitPathComponentSystem.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using UnityEngine;
  2. namespace ET
  3. {
  4. public static class UnitPathComponentSystem
  5. {
  6. private static async ETTask StartMove_Internal(this UnitPathComponent self, ETCancellationToken cancellationToken)
  7. {
  8. for (int i = 0; i < self.Path.Count; ++i)
  9. {
  10. Vector3 v = self.Path[i];
  11. float speed = 5;
  12. if (i == 0)
  13. {
  14. // 矫正移动速度
  15. Vector3 clientPos = self.GetParent<Unit>().Position;
  16. float serverf = (self.ServerPos - v).magnitude;
  17. if (serverf > 0.1f)
  18. {
  19. float clientf = (clientPos - v).magnitude;
  20. speed = clientf / serverf * speed;
  21. }
  22. }
  23. self.Parent.GetComponent<TurnComponent>().Turn(v);
  24. await self.Parent.GetComponent<MoveComponent>().MoveToAsync(v, speed, cancellationToken);
  25. }
  26. }
  27. public static async ETVoid StartMove(this UnitPathComponent self, M2C_PathfindingResult message)
  28. {
  29. // 取消之前的移动协程
  30. self.ETCancellationToken?.Cancel();
  31. self.ETCancellationToken = new ETCancellationToken();
  32. self.Path.Clear();
  33. for (int i = 0; i < message.Xs.Count; ++i)
  34. {
  35. self.Path.Add(new Vector3(message.Xs[i], message.Ys[i], message.Zs[i]));
  36. }
  37. self.ServerPos = new Vector3(message.X, message.Y, message.Z);
  38. await self.StartMove_Internal(self.ETCancellationToken);
  39. self.ETCancellationToken = null;
  40. }
  41. }
  42. }