コード例 #1
0
    /// <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;
    }
コード例 #2
0
    /// <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));
    }