TurnComponent.cs 2.5 KB

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