Use MoveTowards com duração em vez de velocidade
Eu quero me mudarGameObject da posição A a B comVector3.MoveTowards
dentro de x segundos e em uma função de rotina. Eu sei como fazer isso comVector3.Lerp
mas desta vez preferiria fazê-lo comVector3.MoveTowards
já que ambas as funções se comportam de maneira diferente.
ComVector3.Lerp
, isso é feito comoesta:
IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
float counter = 0;
//Get the current position of the object to be moved
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
yield return null;
}
}
Eu tentei fazer a mesma coisa comVector3.MoveTowards
, mas não está funcionando corretamente. O problema é que a movimentação termina antes do x tempo ou duração. Além disso, ele não se move sem problemas. Salta para o meio de ambas as posições do que para o final da posição B.
Esta é a função que usaVector3.MoveTowards
com o problema acima:
IEnumerator MoveTowards(Transform objectToMove, Vector3 toPosition, float duration)
{
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
Vector3 currentPos = objectToMove.position;
float time = Vector3.Distance(currentPos, toPosition) / duration;
objectToMove.position = Vector3.MoveTowards(currentPos, toPosition,
time);
Debug.Log(counter + " / " + duration);
yield return null;
}
}
Como você move o GameObject da posição A para B comVector3.MoveTowards
dentro de x segundos e em uma função de rotina?
Por favor, não sugiraVector3.Lerp
como não é isso que eu quero usar.
EDITAR:
Substituindo
float time = Vector3.Distance(currentPos, toPosition) / duration;
com
float time = Vector3.Distance(startPos, toPosition) / (duration * 60f);
funciona, mas apresenta um problema quando o foco é transferido do Unity para outro aplicativo. Isso faz com que o movimento não termine. Calculá-lo a cada quadro, em vez de uma vez antes de iniciar o timer, parece mais razoável.
A resposta da MatrixTai corrigiu os dois problemas.