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.
Desafio
MédioEsta 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;
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar8A Câmera
Acompanhamento SuaveCâmera OrbitalAntecipaçãoTremor da CâmeraRevisão: Câmera de Perseguição