SkillMoveProcessor.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using UnityEngine;
  2. using System;
  3. public class SkillMoveProcessor
  4. {
  5. readonly Fighter mFighter;
  6. float mAcceleration;
  7. float mInitSpeed;
  8. float mSpeed;
  9. FixVector3 mTargetPosition;
  10. bool mMoveEnd = true;
  11. FixVector3 SelfStartPos;
  12. FixVector3 SelfForward;
  13. Fix64 fStartSpeed;
  14. Fix64 fAcceleration;
  15. int mTotalFrame = 0;
  16. int mFrame = 0;
  17. public Fix64 PositionHeight { get { return (Fix64)mFighter.Position.y; } }
  18. public BattleField Field { get { return mFighter.CurrentBattleField; } }
  19. public bool IsGround { get { return Field == null || PositionHeight <= (Fix64)mFighter.CurrentBattleField.FloorY; } }
  20. public bool IsMoving
  21. {
  22. get { return !mMoveEnd; }
  23. }
  24. public bool IsMovingUp
  25. {
  26. get { return mTargetPosition.y - (Fix64)mFighter.Position.y > Fix64.Zero; }
  27. }
  28. public SkillMoveProcessor (Fighter fighter)
  29. {
  30. mFighter = fighter;
  31. }
  32. public void Start (Fix64 initSpeed,Fix64 acceleration, FixVector3 destPos)
  33. {
  34. Stop ();
  35. SelfStartPos = new FixVector3(mFighter.Position);
  36. mTargetPosition = destPos;
  37. SelfForward = mTargetPosition - SelfStartPos;
  38. SelfForward.Normalize();
  39. fStartSpeed = initSpeed;
  40. fAcceleration = acceleration;
  41. mMoveEnd = false;
  42. //Debug.Log("Start destPos" + destPos.ToString());
  43. Fix64 dist = FixVector3.Distance(destPos, SelfStartPos);
  44. Fix64 time = Fix64.Zero;
  45. if (Fix64.Abs(acceleration) > 0)
  46. {
  47. Fix64 fvalue = (Fix64)2 * acceleration * dist + initSpeed * initSpeed;
  48. if (fvalue > Fix64.Zero)
  49. {
  50. Fix64 vt = Fix64.Sqrt(fvalue);
  51. time = Fix64.Abs(vt - initSpeed) / acceleration;
  52. }
  53. else
  54. {
  55. Fix64 timeV = initSpeed / Fix64.Abs(acceleration);
  56. time = time < timeV ? time : timeV;
  57. }
  58. }
  59. else
  60. {
  61. if(initSpeed > 0)
  62. time = dist / initSpeed;
  63. else
  64. time = Fix64.Zero;
  65. }
  66. mTotalFrame = (int)(time * (Fix64)Constants.frame_to_time) + 2;
  67. //if (mFighter.IsBoss)
  68. // DebugHelper.LogError(mFighter.Name+"------------SkillMoveProcessor:"+ initSpeed+ " acceleration:"+ acceleration+ " destPos:"+ destPos.ToString()+" curPos:"+mFighter.Position.ToString()+" duration:"+mTime);
  69. }
  70. public void Stop ()
  71. {
  72. mMoveEnd = true;
  73. mFrame = 0;
  74. //if (mFighter.IsBoss)
  75. // DebugHelper.LogError("------------Stop:");
  76. }
  77. public void Update (float deltaTime)
  78. {
  79. if (!mMoveEnd)
  80. {
  81. mFrame++;
  82. //帧数差值
  83. Fix64 fLerpTime = (Fix64)mFrame * (Fix64)0.03f;
  84. Fix64 fDis = fStartSpeed * fLerpTime + (Fix64)0.5f * fAcceleration * fLerpTime * fLerpTime;
  85. FixVector3 pos = SelfStartPos + SelfForward * fDis;
  86. //Debug.Log("fAcceleration" + fAcceleration.ToString() + "dist =" + fDis.ToString() + "mFrame =" + (mFrame/ mTotalFrame).ToString() + "pos"+ pos.ToString());
  87. FixVector3 v3Forward = mTargetPosition - pos;
  88. v3Forward.Normalize();
  89. if (FixVector3.Dot(SelfForward, v3Forward) <= Fix64.Zero)
  90. {
  91. mFighter.SyncPosition(mTargetPosition.ToVector3());
  92. Stop();
  93. return;
  94. }
  95. //mFighter.SyncPosition(pos.ToVector3());
  96. mFighter.Ctrl.MoveTo(pos);
  97. if (mFrame >= mTotalFrame)
  98. {
  99. mFighter.SyncPosition(pos.ToVector3());
  100. Stop();
  101. return;
  102. }
  103. }
  104. }
  105. }