Menu
CoddyTech

Mire com a Raquete

Lição 4 de 19 do curso Jogo Unity: Quebra-Tijolos da Coddy.

Com um quique perfeito, o jogador não consegue mirar. Nos jogos de Brick Breaker, a direção depende da raquete: um toque perto da extremidade esquerda manda a bola para cima e para a esquerda; um toque no meio manda a bola direto para cima.

Transforme o ponto do toque em um número de -1, na extremidade esquerda, a 1, na extremidade direita: o deslocamento da bola no eixo x em relação ao centro da raquete, dividido pela metade da largura da raquete. Uma raquete com largura 4, centralizada em x 2, atingida em x 3: o deslocamento é 1, metade da largura é 2, então o número é 0.5, e a bola parte na direção (0.5, 1, 0), normalizada. Limite esse valor, pois a bola pode tocar um canto um pouco além da extremidade.

OnCollisionEnter é executado depois que a física calcula o quique, então uma velocidade definida ali o substitui. As paredes também enviam a bola para outra direção e mantêm seu quique simples, então verifique a tag primeiro. collision.collider.bounds.size.x é a largura da raquete no mundo.

challenge icon

Desafio

Fácil

Mire a bola com a plataforma: o ponto onde ela aterrissa define o ângulo.

  1. Em Ball, adicione OnCollisionEnter(Collision collision); retorne a menos que o objeto atingido esteja marcado com a tag Paddle.
  2. Calcule float x: a coordenada x da bola menos a coordenada x da plataforma, dividido pela metade de collision.collider.bounds.size.x, limitado entre -1 e 1.
  3. Defina rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Pressione “Jogar” e pegue a bola na extremidade esquerda da plataforma: ela voa para a esquerda. Depois, pressione “Verificar”.

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>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

    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;
    }

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}

Todas as lições de Jogo Unity: Quebra-Tijolos

Pratique por conta própria: Playground de Unity