| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using UnityEngine;
- using System;
- public class SkillMoveProcessor
- {
- readonly Fighter mFighter;
- float mAcceleration;
- float mInitSpeed;
- float mSpeed;
- FixVector3 mTargetPosition;
- bool mMoveEnd = true;
- FixVector3 SelfStartPos;
- FixVector3 SelfForward;
- Fix64 fStartSpeed;
- Fix64 fAcceleration;
- int mTotalFrame = 0;
- int mFrame = 0;
- public Fix64 PositionHeight { get { return (Fix64)mFighter.Position.y; } }
- public BattleField Field { get { return mFighter.CurrentBattleField; } }
- public bool IsGround { get { return Field == null || PositionHeight <= (Fix64)mFighter.CurrentBattleField.FloorY; } }
- public bool IsMoving
- {
- get { return !mMoveEnd; }
- }
- public bool IsMovingUp
- {
- get { return mTargetPosition.y - (Fix64)mFighter.Position.y > Fix64.Zero; }
- }
- public SkillMoveProcessor (Fighter fighter)
- {
- mFighter = fighter;
- }
- public void Start (Fix64 initSpeed,Fix64 acceleration, FixVector3 destPos)
- {
- Stop ();
- SelfStartPos = new FixVector3(mFighter.Position);
- mTargetPosition = destPos;
- SelfForward = mTargetPosition - SelfStartPos;
- SelfForward.Normalize();
- fStartSpeed = initSpeed;
- fAcceleration = acceleration;
- mMoveEnd = false;
- //Debug.Log("Start destPos" + destPos.ToString());
- Fix64 dist = FixVector3.Distance(destPos, SelfStartPos);
- Fix64 time = Fix64.Zero;
- if (Fix64.Abs(acceleration) > 0)
- {
- Fix64 fvalue = (Fix64)2 * acceleration * dist + initSpeed * initSpeed;
- if (fvalue > Fix64.Zero)
- {
- Fix64 vt = Fix64.Sqrt(fvalue);
- time = Fix64.Abs(vt - initSpeed) / acceleration;
- }
- else
- {
- Fix64 timeV = initSpeed / Fix64.Abs(acceleration);
- time = time < timeV ? time : timeV;
- }
- }
- else
- {
- if(initSpeed > 0)
- time = dist / initSpeed;
- else
- time = Fix64.Zero;
- }
- mTotalFrame = (int)(time * (Fix64)Constants.frame_to_time) + 2;
- //if (mFighter.IsBoss)
- // DebugHelper.LogError(mFighter.Name+"------------SkillMoveProcessor:"+ initSpeed+ " acceleration:"+ acceleration+ " destPos:"+ destPos.ToString()+" curPos:"+mFighter.Position.ToString()+" duration:"+mTime);
- }
- public void Stop ()
- {
- mMoveEnd = true;
- mFrame = 0;
- //if (mFighter.IsBoss)
- // DebugHelper.LogError("------------Stop:");
- }
- public void Update (float deltaTime)
- {
- if (!mMoveEnd)
- {
- mFrame++;
- //帧数差值
- Fix64 fLerpTime = (Fix64)mFrame * (Fix64)0.03f;
- Fix64 fDis = fStartSpeed * fLerpTime + (Fix64)0.5f * fAcceleration * fLerpTime * fLerpTime;
- FixVector3 pos = SelfStartPos + SelfForward * fDis;
- //Debug.Log("fAcceleration" + fAcceleration.ToString() + "dist =" + fDis.ToString() + "mFrame =" + (mFrame/ mTotalFrame).ToString() + "pos"+ pos.ToString());
- FixVector3 v3Forward = mTargetPosition - pos;
- v3Forward.Normalize();
- if (FixVector3.Dot(SelfForward, v3Forward) <= Fix64.Zero)
- {
- mFighter.SyncPosition(mTargetPosition.ToVector3());
- Stop();
- return;
- }
- //mFighter.SyncPosition(pos.ToVector3());
- mFighter.Ctrl.MoveTo(pos);
- if (mFrame >= mTotalFrame)
- {
- mFighter.SyncPosition(pos.ToVector3());
- Stop();
- return;
- }
- }
- }
-
- }
|