GameObject mudar de posição suavemente na Unity 3D

Através do método Lerp da classe Vector3 é possível criar transições dentro de um determinado tempo.

Podemos mover GameObjects de diferentes formas, seja pelo método Translate ou até mesmo por meio de  keyframes de animações. Saber qual recurso utilizar é muito importante para que a performance do projeto não seja impactada.

A classe Vector3 contém inúmeros métodos, um deles que é o que vamos estudar hoje, é o Lerp. Ele recebe a posição inicial, posição final e o tempo que vai levar para o GameObject se deslocar do ponto A para o B.

Para o nosso exemplo, vamos mover um cubo para um determinado ponto, que aqui está definido como um Empty.

Cenário de Dungeon utilizado para o nosso teste.
Cenário de Dungeon utilizado para o nosso teste.

A utilização do método é bem simples, basicamente ele executa o calculo (a + (b - a) * t) a cada frame. 

Vamos criar um script chamado de PositionLerp, ele contém todo código comentado abaixo.

using UnityEngine;

public class PositionLerp : MonoBehaviour
{
	//Transform com a posição final
	public Transform destination;

	//Velocidade de locomoção
	public float velocity = 5.0f;

	//Controla se a tecla E foi pressionada
	private bool move = false;

	void Update()
	{
		//Verifica se a tecla E foi pressionada
		if (Input.GetKeyDown(KeyCode.E))
			move = true;

		//Caso o valor da variável move seja false, então ignora os passos seguintes
		if (!move)
			return;

		//A posição do objeto a cada novo frame recebe o calculo do método Lerp
		transform.position = Vector3.Lerp(
			transform.position, //Posição inicial
			destination.position, //Posição final
			velocity * Time.deltaTime //Velocidade multiplicado por 0.02 segundos (deltaTime padrão)
			);
	}
}

O nosso exemplo acima está todo comentado, mas vamos entender o motivo de detectarmos quando uma tecla é pressionada. Como não queremos que o objeto comece a andar sozinho após a cena iniciar, criamos a variável move que recebe o valor true se pressionarmos a tecla E.

Arraste o script para o GameObject que deseja mover, em seguida, na propriedade destination do script, arraste o GameObject de destino, como mostra a imagem abaixo. Na propriedade velocity você pode testar diferentes valores até deixar a velocidade devidamente ajustada.

Script que muda a posição do GameObject suavemente+
Script que muda a posição do GameObject suavemente+

Agora é só reproduzir o game e pressionar a tecla E para que a movimentação aconteça.

Resultado final com a movimentação
Resultado final com a movimentação

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Deixe um comentário