Menu
CoddyTech

Tremor da Câmera

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 48 de 63.

Uma sacudida é uma sequência curta de deslocamentos aleatórios: por alguns décimos de segundo, a câmera fica em um ponto aleatório próximo à sua posição de repouso, um novo a cada quadro, e então volta. Uma coroutine funciona bem, porque é executada ao longo de vários quadros e termina sozinha. Esta câmera treme quando uma pedra cai (outro script chama BoulderLanded(); o arquivo começa com using System.Collections; para IEnumerator):

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength é um deslocamento aleatório de até strength de comprimento em qualquer direção, e yield return null escolhe um novo no próximo quadro. Adicionar Time.deltaTime a cada passagem conta segundos reais, então a sacudida dura duration em qualquer taxa de quadros. A última linha coloca a câmera de volta; sem ela, a câmera fica onde o último deslocamento a deixou.

A cada quadro, o Unity executa todos os Update(), depois as coroutines aguardando yield return null, e então todos os LateUpdate(). Portanto, uma câmera de acompanhamento que define sua posição em LateUpdate() sobrescreve o que a sacudida fez. Sacudir localPosition evita isso quando a câmera é filha de um objeto vazio que faz o acompanhamento: o objeto pai se move, e a câmera treme ao redor de sua posição nele.

challenge icon

Desafio

Médio

Esta câmera segue o jogador (as setas a movem): em LateUpdate(), ela fica na posição do jogador mais offset, e não é filha de nada. Faça-a tremer enquanto segue o jogador:

  • A tecla Space faz a câmera tremer por duration (0.4) segundos. A cada quadro da trepidação, a câmera fica em um novo ponto aleatório a até strength (0.3) de distância da posição que ocupa ao seguir o jogador, enquanto continua seguindo-o.
  • Quando a trepidação termina, ela volta exatamente à posição que ocupa ao seguir o jogador.

A tecla Space já inicia a coroutine Shake(). Pressione Play, corra e pressione Space, depois Check.

Experimente você mesmo

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // Sacuda a câmera por duration segundos, afastando-a até strength de sua posição de acompanhamento.
        yield return null;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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