Menu
CoddyTech

Mire com a Raquete

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

Com um rebote perfeito, o jogador não consegue mirar: a bola sai da raquete no mesmo ângulo em que chegou. Nos jogos Brick Breaker, a raquete decide. Uma rebatida perto da extremidade esquerda envia a bola para cima e para a esquerda; uma rebatida no meio a envia direto para cima; e, quanto mais longe do meio, maior o ângulo.

Transforme a rebatida em um número de -1 na extremidade esquerda a 1 na extremidade direita: o deslocamento da bola em x em relação ao centro da raquete, dividido pela metade da largura da raquete. Digamos que a raquete tenha 4 unidades de largura, com o centro em x = 2, e a bola bata em x = 3. O deslocamento é 1, metade da largura é 2, então o número é 0.5, e a nova direção é 0.5 na horizontal e 1 para cima, (0.5, 1, 0), normalizada. Uma rebatida bem na extremidade resulta em 1 ou -1, que corresponde a 45 graus em relação à vertical. Limite o número a esse intervalo, porque a bola pode tocar o canto da raquete um pouco além da extremidade.

O OnCollisionEnter da bola é executado depois que a física calcula o rebote, então definir uma velocidade ali a substitui. As paredes enviam a mesma mensagem e devem manter seu rebote normal, então verifique primeiro o que foi atingido. collision.collider.bounds é a caixa ocupada pelo colisor no mundo, incluindo a escala:

void OnCollisionEnter(Collision collision)
{
    Bounds box = collision.collider.bounds;
    Debug.Log(collision.gameObject.name + " is " + box.size.x + " wide, centered at x = " + box.center.x);
}
challenge icon

Desafio

Fácil

Adicione OnCollisionEnter(Collision collision) a Ball:

  1. Não faça nada a menos que o objeto atingido tenha a tag Paddle.
  2. Calcule x: o x da bola menos o x do paddle, dividido pela metade da largura do paddle (collision.collider.bounds.size.x), mantendo o resultado entre -1 e 1.
  3. Defina a velocidade do Rigidbody como new Vector3(x, 1f, 0f), normalizado, multiplicado por speed.

Pressione Play, pegue a bola perto de cada extremidade do paddle e, em seguida, 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>();
        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;
    }
}
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 Jogo no Unity: Quebra-Tijolos