MoveComponentSystem.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using UnityEngine;
  3. namespace ET
  4. {
  5. public class MoveComponentUpdateSystem: UpdateSystem<MoveComponent>
  6. {
  7. public override void Update(MoveComponent self)
  8. {
  9. if (self.moveTcs == null)
  10. {
  11. return;
  12. }
  13. Unit unit = self.GetParent<Unit>();
  14. long timeNow = TimeHelper.ClientNow();
  15. if (timeNow - self.StartTime >= self.needTime)
  16. {
  17. unit.Position = self.Target;
  18. ETTaskCompletionSource tcs = self.moveTcs;
  19. self.moveTcs = null;
  20. tcs.SetResult();
  21. return;
  22. }
  23. float amount = (timeNow - self.StartTime) * 1f / self.needTime;
  24. unit.Position = Vector3.Lerp(self.StartPos, self.Target, amount);
  25. }
  26. }
  27. public static class MoveComponentSystem
  28. {
  29. public static async ETTask MoveToAsync(this MoveComponent self,Vector3 target, float speedValue, ETCancellationToken cancellationToken)
  30. {
  31. Unit unit = self.GetParent<Unit>();
  32. if ((target - self.Target).magnitude < 0.1f)
  33. {
  34. await ETTask.CompletedTask;
  35. }
  36. self.Target = target;
  37. self.StartPos = unit.Position;
  38. self.StartTime = TimeHelper.ClientNow();
  39. float distance = (self.Target - self.StartPos).magnitude;
  40. if (Math.Abs(distance) < 0.1f)
  41. {
  42. await ETTask.CompletedTask;
  43. }
  44. self.needTime = (long) (distance / speedValue * 1000);
  45. self.moveTcs = new ETTaskCompletionSource();
  46. cancellationToken.Add(() => { self.moveTcs = null; });
  47. await self.moveTcs.Task;
  48. }
  49. }
  50. }