/// <summary> /// Move Object directly to position. /// </summary> /// <param name='position'> /// Position. /// </param> /// <param name='interruptable'> /// Interruptable. /// </param> public void MoveToPosition(MovableObjectController.MovableObjectPosition position, float speed, bool interruptable) { if (State == MoveableObjectStates.MOVING && !mInterruptable) { return; } mPositionQueue.Clear(); mPositionQueue.Add(position); mMoveSpeed = speed; mCurrentMoveTime = 0f; mInterruptable = interruptable; mPreviousPosition = mCurrentPosition; mCurrentPosition = -1; mTargetPosition = 0; State = MoveableObjectStates.MOVING; }
private void Update() { switch(State) { case MoveableObjectStates.IDLE: break; case MoveableObjectStates.MOVING: if (mMoveMode == MoveModes.LERP) { transform.position = Vector3.Lerp(transform.position, mOriginalPosition + mPositionQueue[mTargetPosition].Position, mMoveSpeed * Time.deltaTime); transform.rotation = Quaternion.Lerp(transform.rotation, mPositionQueue[mTargetPosition].Rotation, mMoveSpeed * Time.deltaTime); } else if (mMoveMode == MoveModes.LINEAR) { transform.position += (mMoveDirection * (mMoveSpeed * Time.deltaTime)); transform.rotation = Quaternion.Lerp(transform.rotation, mPositionQueue[mTargetPosition].Rotation, (1 - ((mOriginalPosition + mPositionQueue[mTargetPosition].Position) - transform.position).magnitude / mOriginalMagnitude)); } if ( ((mOriginalPosition + mPositionQueue[mTargetPosition].Position) - transform.position).magnitude < kMinimumStopDistance) { transform.position = mOriginalPosition + mPositionQueue[mTargetPosition].Position; transform.rotation = mPositionQueue[mTargetPosition].Rotation; mTargetPosition += mIterateDirection; if (mTargetPosition >= mPositionQueue.Count || mTargetPosition < 0) { mCurrentMoveTime = 0; mCurrentPosition = mTargetPosition; if (mLoopMode == LoopModes.NONE) { mTargetPosition = -1; State = MoveableObjectStates.IDLE; return; } else if (mLoopMode == LoopModes.WRAP) { mTargetPosition = mTargetPosition < 0 ? mPositionQueue.Count - 1 : 0; } else if (mLoopMode == LoopModes.PINGPONG) { mIterateDirection *= -1; mTargetPosition += mIterateDirection; } } mMoveDirection = ((mOriginalPosition + mPositionQueue[mTargetPosition].Position) - transform.position); mOriginalMagnitude = mMoveDirection.magnitude; mMoveDirection = mMoveDirection.normalized; } mCurrentMoveTime += Time.deltaTime; break; } }
public void GivePath(List<MovableObjectController.MovableObjectPosition> positions, float speed, bool interruptable, MoveModes moveMode, LoopModes loopMode) { if (State == MoveableObjectStates.MOVING && !mInterruptable) { return; } mPositionQueue.Clear(); mPositionQueue = positions; mMoveSpeed = speed; mMoveMode = moveMode; mLoopMode = loopMode; mMoveDirection = ((mOriginalPosition + mPositionQueue[0].Position) - transform.position); mOriginalMagnitude = mMoveDirection.magnitude; mMoveDirection = mMoveDirection.normalized; mCurrentMoveTime = 0f; mInterruptable = interruptable; mPreviousPosition = mCurrentPosition; mCurrentPosition = -1; mTargetPosition = 0; State = MoveableObjectStates.MOVING; }