#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 .