Menu
CoddyTech

Acompanhamento Suave

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 47 de 71.

Uma câmera que copia a posição do jogador mais um deslocamento em LateUpdate() transforma cada solavanco do jogador em um solavanco da visão. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) retorna uma posição que se move em direção a target como uma mola amortecida: ela acelera, desacelera ao se aproximar do alvo e chega sem ultrapassá-lo. Esta câmera segue o jogador a 3 unidades acima e 6 atrás, com um pequeno atraso:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref passa a própria variável para SmoothDamp, em vez de uma cópia, para que o método possa alterá-la. SmoothDamp mantém em velocity a velocidade atual da câmera nos três eixos e precisa recebê-la de volta no próximo quadro, por isso ela é um campo. Se fosse declarada dentro de LateUpdate(), começaria em zero a cada quadro, e a câmera avançaria lentamente, cerca de meio por cento do percurso por quadro. Para um único número, como o zoom de uma câmera, Mathf.SmoothDamp funciona da mesma forma com uma velocidade float.

smoothTime define o quanto a câmera fica para trás: com 0.3, ela percorre cerca de 60% de um salto repentino em 0.3 segundos e chega quase ao destino após 1 segundo. Um valor menor faz com que ela acompanhe mais de perto. SmoothDamp lê Time.deltaTime por conta própria, então nada na chamada é multiplicado por ele.

challenge icon

Desafio

Médio

Faça a câmera acompanhar o jogador suavemente a uma altura fixa.

  1. Adicione um campo Vector3 velocity;.
  2. Em LateUpdate(), crie Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, para que um salto não mova a visualização.
  3. Defina transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Pressione “Jogar”, corra e salte: a câmera fica um pouco para trás e nunca oscila. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Mova-se suavemente em direção ao ponto acima do player (x), back unidades atrás dele (z), a uma altura fixa.
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity