Mantenha a Velocidade
Lição 3 de 16 do curso Jogo no Unity: Quebra-Tijolos da Coddy.
Uma bola de Brick Breaker nunca perde velocidade. O PhysicsMaterial faz a maior parte do trabalho: o valor 1 de elasticidade mantém toda a velocidade do quique, e o atrito 0 impede que as paredes arrastem ou façam a bola girar. As paredes e os tijolos não têm material próprio, e o Unity combina os valores dos dois colisores, por padrão usando Average: o valor 1 da bola e o valor padrão 0 de uma parede fazem com que o quique aconteça com metade da velocidade. bounceCombine = Maximum e frictionCombine = Minimum permitem que os valores da própria bola prevaleçam sobre qualquer coisa com que ela colida.
A física ainda não é exata: uma raquete em movimento adiciona sua própria velocidade ao quique, duas bolas empurram uma à outra, e pequenos erros se acumulam ao longo de centenas de quiques. Por isso, a cada FixedUpdate, a bola mantém sua direção e tem sua velocidade redefinida. O Rigidbody da bola também tem a opção Freeze Position Z marcada no Inspector, o que a mantém no plano de jogo.
Um jogo diferente exige uma regra diferente. Um disco de hóquei de mesa pode desacelerar, mas nunca ultrapassar um limite de velocidade, e Vector3.ClampMagnitude encurta um vetor que é longo demais e mantém inalterado um vetor mais curto:
void FixedUpdate()
{
rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}Um limite não basta para a bola: se ela desacelerar até 2 unidades por segundo, continuará a essa velocidade. A velocidade dela precisa ser definida com exatidão, a partir de sua direção.
Desafio
FácilEm Ball:
- Em
Awake(), crie umnew PhysicsMaterial("Bouncy")com elasticidade 1, atrito dinâmico e estático 0,bounceCombineMaximum efrictionCombineMinimum, e atribua-o ao colisor da bola comGetComponent<Collider>().material. - Adicione
FixedUpdate(): enquanto a bola estiver lançada, defina sualinearVelocitycomo sua direção atual multiplicada porspeed.
No Unity, você também pode criar o material como um recurso (Create > Physics Material) e arrastá-lo para o campo Material do Sphere Collider; aqui, o script o cria.
Pressione Play, lance a bola e observe-a quicar; em seguida, clique em Check.
Experimente você mesmo
using UnityEngine;
using UnityEngine.InputSystem;
public class Ball : MonoBehaviour
{
public Transform paddle;
public float speed = 9f;
Rigidbody rb;
bool launched;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (launched) return;
transform.position = paddle.position + Vector3.up * 0.5f;
if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
}
public void Launch(Vector3 direction)
{
launched = true;
rb.linearVelocity = direction.normalized * speed;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.