Estou tentando mover suavemente um objeto do ponto a para o ponto b:
Instantiate(cat, OffScreenLeft(), Quaternion.identity);
Debug.Log("start position: " + OffScreenLeft());
Debug.Log("end position: " + InPosition());
StartCoroutine(MoveFromTo(cat.transform, OffScreenLeft(), InPosition(), 3f));
IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed) {
float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
float t = 0;
while (t <= 1.0f) {
t += step; // Goes from 0 to 1, incrementing by step each time
objectToMove.position = Vector3.Lerp(a, b, t); // Move objectToMove closer to b
yield return new WaitForFixedUpdate();
}
objectToMove.position = b;
Debug.Log("move complete cat: " + cat.transform.position);
}
Aqui está a saída de depuração:
start position: (-20.34, 4.33)
end position: (-8.67, 4.33)
move complete cat: (-8.67, 4.33, 0.00)
A saída de depuração mostra que o gato deveria ter se movido. Mas ele ainda aparece fora da tela, deixado em sua posição original. O que estou esquecendo?
Você instancia um novo objeto na primeira linha. Instanciação é uma espécie de copiar objeto e colocá-lo na cena. Então, você cria uma cópia
cat
e a coloca na cena. Mas depois disso você continua trabalhando comcat
o objeto. Então você está mudando o objeto originalcat
(prefab ou algo assim) em vez de criar um.Você tem que usar o objeto que você recebe como valor de retorno do
Instantiate
método e continuar suas manipulações com ele.