/// <summary> /// Movement coroutine. Approaches a specified point, then fires a callback on completion. /// </summary> /// <returns>The to coroutine.</returns> /// <param name="target">Target.</param> /// <param name="onComplete">On complete.</param> /// <param name="minDistance">Minimum distance.</param> protected virtual IEnumerator MoveToCoroutine(Vector2 target, MovementCallback2d onComplete, float minDistance) { while (!SaFrMo.CloseEnough2d((Vector2)transform.position, target, minDistance)) { Vector2 nextPoint = Vector2.MoveTowards((Vector2)transform.position, target, speed * Time.deltaTime); if (rigid2d != null) { rigid2d.MovePosition(nextPoint); } else { rigid.MovePosition((Vector3)nextPoint); } yield return(new WaitForEndOfFrame()); } // Fire callback if specified if (onComplete != null) { onComplete.Invoke(); } // Clean out current coroutine reference currentCoroutine = null; }
/// <summary> /// Moves to a specified point, firing a callback on completion. /// </summary> /// <param name="position">Position.</param> /// <param name="onComplete">On complete.</param> /// <param name="interruptCurrentMovement">If set to <c>true</c> interrupt current movement.</param> public virtual void MoveTo(Vector2 position, MovementCallback2d onComplete = null, float minDistance = 0.01f, bool interruptCurrentMovement = true) { // Stop current movement if desired if (interruptCurrentMovement && currentCoroutine != null) { StopAutomaticMovement(); } currentCoroutine = StartCoroutine(MoveToCoroutine(position, onComplete, minDistance)); }