Как я могу заставить объект вернуться в исходное положение после того, как он достиг цели?

#c# #unity3d

#c# #unity3d

Вопрос:

Начиная с :

 StartCoroutine(ThrowObject(objToThrow.transform, primaryTarget.transform, throwSpeed));
  

Затем :

 IEnumerator ThrowObject(Transform objectToMove, Transform toPosition, float duration)
    {
        float counter = 0;

        while (counter < duration)
        {
            counter  = Time.deltaTime;
            Vector3 currentPos = objectToMove.position;

            float time = Vector3.Distance(currentPos, toPosition.position) / (duration - counter) * Time.deltaTime;

            objectToMove.position = Vector3.MoveTowards(currentPos, toPosition.position, time);

            yield return null;
        }
    }
  

Когда objectToMove достиг цели (ToPosition), я хочу, чтобы скрипт выполнил какое-то действие, пока не имеет значения, что ждет 5 секунд, или произвел какой-то эффект, но что-то сделать, а затем заставить objectToMove вернуться в исходное положение, в которое он был брошен с той же скоростью.

Это то, что я пробовал :

 IEnumerator ThrowObject(Transform objectToMove, Transform toPosition, float duration)
    {
        float counter = 0;

        while (counter < duration)
        {
            counter  = Time.deltaTime;
            Vector3 currentPos = objectToMove.position;

            float time = Vector3.Distance(currentPos, toPosition.position) / (duration - counter) * Time.deltaTime;

            objectToMove.position = Vector3.MoveTowards(currentPos, toPosition.position, time);

            yield return null;
        }

        StartCoroutine(ThrowBack(objectToMove, toPosition, duration));
    }

    IEnumerator ThrowBack(Transform objectToMove, Transform toPosition, float duration)
    {
        float counter = 0;

        while (counter < duration)
        {
            counter  = Time.deltaTime;
            Vector3 currentPos = objectToMove.position;

            float time = Vector3.Distance(currentPos, toPosition.position) / (duration - counter) * Time.deltaTime;

            objectToMove.position = Vector3.MoveTowards(toPosition.position, currentPos, time);

            yield return null;
        }
    }
  

Но он никогда не перемещает его обратно. Это возврат к строке :

 objectToMove.position = Vector3.MoveTowards(toPosition.position, currentPos, time);
  

Но objectToMove никогда не перемещается назад и вообще не перемещается, он продолжает оставаться в целевом положении.

Ответ №1:

Проще всего получить начальную позицию в начале программы или создания экземпляра объекта следующим образом:

 //Variables
private Vector3 startPos;

//Code
private void Start() //or when you want to get the position
{
    startPos = transform.position;
}

//when you want to move back to the original position do this:

  objectToMove.position = Vector3.MoveTowards(startPos);
  

для вашего экземпляра я бы, скорее всего, сделал start void в начале перечислителя.
это установит startpos , но startpos — это только 1 частная переменная, поэтому вам нужно будет также объявить ее в enumerator, чтобы она была относительно каждого objectToMove .