Menu
CoddyTech

Raquete larga

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

Um efeito temporizado é uma coroutine: alterar, esperar, restaurar. Uma segunda coleta enquanto a primeira ainda está ativa deve iniciar a contagem do tempo novamente, então mantenha a Coroutine que StartCoroutine retorna e interrompa-a antes de iniciar uma nova. Caso contrário, a primeira termina mais cedo e desfaz a segunda. Um aumento de velocidade:

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

Isso define a velocidade com base em normalSpeed, armazenada uma única vez, em vez de dobrar a velocidade atual: dois aumentos seguidos fariam com que ela ficasse 4 vezes mais rápida. O limite da raquete consulta sua largura a cada etapa, então uma raquete larga ainda para nas paredes.

challenge icon

Desafio

Difícil

Um aprimoramento Wide deixa o paddle mais largo por 8 segundos.

  1. Em Paddle, adicione public float wideFactor = 1.6f; e public float wideSeconds = 8f;, e mantenha a escala x normal em Awake.
  2. Widen() interrompe a coroutine em execução, se houver, e inicia uma: escala x igual a wideFactor vezes a normal, aguarde wideSeconds e volte ao normal.
  3. A coroutine precisa de using System.Collections;.

Pressione “Jogar” e pegue um verde: o paddle cresce e depois volta a encolher. Em seguida, clique em “Verificar”.

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

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

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

Pratique por conta própria: Playground de Unity