A Raquete
Lição 1 de 16 do curso Jogo no Unity: Quebra-Tijolos da Coddy.
Neste curso, você cria Brick Breaker em 3D: uma raquete na parte inferior, uma bola que quica entre as paredes e uma parede de tijolos para quebrar. Cada aula adiciona um recurso: os tijolos, vidas, níveis, uma tela de fim de jogo e power-ups que aumentam a largura da raquete ou dividem a bola. A cena está pronta: a câmera olha para o campo de jogo pela frente, e tudo se move no plano x e y em z = 0. Por enquanto, os scripts Paddle, Ball, Brick, GameManager e PowerUp são stubs curtos.
A raquete tem um Rigidbody cinemático, movido com MovePosition em FixedUpdate, para que a física perceba seu movimento e os quiques da bola possam usar isso depois. Um corpo cinemático nunca é parado por colisores que não têm Rigidbody, então as paredes laterais não vão segurá-lo: o script o mantém dentro dos limites. Limitar o centro na parede deixaria metade do objeto dentro dela, então o limite é a parede menos metade do tamanho do objeto. Este carro de elevador em um poço de y = 0 a y = 12 faz isso em y:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);Aqui, input é 1 ao subir, -1 ao descer e 0 nos outros casos. Um carro com 2 unidades de altura mantém seu centro entre 1 e 11, então suas extremidades param exatamente em 0 e 12. Uma primitiva Cube tem 1 unidade de cada lado, então localScale.y é a altura do carro, e lê-lo a cada passo mantém o limite correto se o tamanho mudar enquanto o jogo estiver em execução.
Desafio
FácilEscreva o movimento da raquete em Paddle's FixedUpdate():
- Crie um
float input: -1 enquanto a seta para a esquerda ou A estiver pressionada, 1 enquanto a seta para a direita ou D estiver pressionada, 0 caso contrário. - Calcule o alvo: a posição do Rigidbody deslocada para a direita por
input * speed * Time.fixedDeltaTime. - Limite o x do alvo para que as extremidades da raquete parem nas faces internas das paredes,
-wallXewallX. A largura da raquete étransform.localScale.x. - Mova-se até lá com
rb.MovePosition.
Pressione Play, deslize a raquete até as duas paredes e, em seguida, Check.
Experimente você mesmo
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // as faces internas das paredes laterais estão em -wallX e wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Mova-se com as setas ou com A e D e permaneça entre as paredes.
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.