Menu
CoddyTech

Raquete larga

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

Um power-up Wide capturado pela raquete deixa-a mais larga por alguns segundos. O power-up detecta a captura: seu colisor de gatilho toca o colisor da raquete, e ambos os corpos são cinemáticos, o que é suficiente para OnTriggerEnter. Ele também atravessa a bola enquanto cai, então verifica a tag. Um enum com os tipos, definido para cada prefab no Inspector, diferencia um power-up do outro.

Um efeito temporizado é uma coroutine: alterar, esperar, alterar de volta. Uma segunda captura enquanto a primeira ainda está em execução precisa reiniciar a contagem do tempo, então guarde a Coroutine que StartCoroutine retorna e interrompa-a antes de iniciar uma nova. Caso contrário, a primeira termina antes da hora e desfaz a segunda. Um aumento de velocidade:

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

O aumento define a velocidade a partir de normalSpeed, armazenada uma vez, em vez de dobrar a velocidade atual e reduzi-la pela metade depois: dois aumentos seguidos fariam com que a velocidade ficasse 4 vezes maior. O limite da raquete já lê sua largura a cada passo, então uma raquete larga ainda para nas paredes.

challenge icon

Desafio

Difícil
  1. Em PowerUp, adicione public enum Kind { Wide, Multiball } e public Kind kind (cada prefab define seu tipo). Adicione OnTriggerEnter: quando o power-up tocar no objeto marcado com a tag Paddle, um do tipo Wide chama Widen() no script Paddle desse objeto, e qualquer um dos tipos destrói o power-up.
  2. Em Paddle, adicione public float wideFactor = 1.6f e public float wideSeconds = 8f, e armazene a largura normal do paddle, sua escala em x, em Awake().
  3. Escreva public void Widen(): ele inicia uma coroutine que define a escala em x do paddle como wideFactor vezes a largura normal, aguarda wideSeconds e restaura a largura normal. Se o paddle for atingido novamente enquanto estiver largo, o tempo recomeça.

Um power-up Multiball é coletado e ainda não faz nada.

Pressione Play, colete um power-up verde 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()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
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