TurnComponent.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using UnityEngine;
  2. namespace ET
  3. {
  4. [ObjectSystem]
  5. public class TurnComponentUpdateSystem : UpdateSystem<TurnComponent>
  6. {
  7. public override void Update(TurnComponent self)
  8. {
  9. self.Update();
  10. }
  11. }
  12. public class TurnComponent : Entity
  13. {
  14. // turn
  15. public Quaternion To;
  16. public Quaternion From;
  17. public float t = float.MaxValue;
  18. public float TurnTime = 0.1f;
  19. public void Update()
  20. {
  21. UpdateTurn();
  22. }
  23. private void UpdateTurn()
  24. {
  25. //Log.Debug($"update turn: {this.t} {this.TurnTime}");
  26. if (this.t > this.TurnTime)
  27. {
  28. return;
  29. }
  30. this.t += Time.deltaTime;
  31. Quaternion v = Quaternion.Slerp(this.From, this.To, this.t / this.TurnTime);
  32. this.GetParent<Unit>().Rotation = v;
  33. }
  34. /// <summary>
  35. /// 改变Unit的朝向
  36. /// </summary>
  37. public void Turn2D(Vector3 dir, float turnTime = 0.1f)
  38. {
  39. Vector3 nexpos = this.GetParent<Unit>().ViewGO.transform.position + dir;
  40. Turn(nexpos, turnTime);
  41. }
  42. /// <summary>
  43. /// 改变Unit的朝向
  44. /// </summary>
  45. public void Turn(Vector3 target, float turnTime = 0.1f)
  46. {
  47. Quaternion quaternion = PositionHelper.GetVector3ToQuaternion(this.GetParent<Unit>().Position, target);
  48. this.To = quaternion;
  49. this.From = this.GetParent<Unit>().Rotation;
  50. this.t = 0;
  51. this.TurnTime = turnTime;
  52. }
  53. /// <summary>
  54. /// 改变Unit的朝向
  55. /// </summary>
  56. /// <param name="angle">与X轴正方向的夹角</param>
  57. public void Turn(float angle, float turnTime = 0.1f)
  58. {
  59. Quaternion quaternion = PositionHelper.GetAngleToQuaternion(angle);
  60. this.To = quaternion;
  61. this.From = this.GetParent<Unit>().Rotation;
  62. this.t = 0;
  63. this.TurnTime = turnTime;
  64. }
  65. public void Turn(Quaternion quaternion, float turnTime = 0.1f)
  66. {
  67. this.To = quaternion;
  68. this.From = this.GetParent<Unit>().Rotation;
  69. this.t = 0;
  70. this.TurnTime = turnTime;
  71. }
  72. public void TurnImmediately(Quaternion quaternion)
  73. {
  74. this.GetParent<Unit>().Rotation = quaternion;
  75. }
  76. public void TurnImmediately(Vector3 target)
  77. {
  78. Vector3 nowPos = this.GetParent<Unit>().Position;
  79. if (nowPos == target)
  80. {
  81. return;
  82. }
  83. Quaternion quaternion = PositionHelper.GetVector3ToQuaternion(this.GetParent<Unit>().Position, target);
  84. this.GetParent<Unit>().Rotation = quaternion;
  85. }
  86. public void TurnImmediately(float angle)
  87. {
  88. Quaternion quaternion = PositionHelper.GetAngleToQuaternion(angle);
  89. this.GetParent<Unit>().Rotation = quaternion;
  90. }
  91. public override void Dispose()
  92. {
  93. if (this.IsDisposed)
  94. {
  95. return;
  96. }
  97. base.Dispose();
  98. }
  99. }
  100. }