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.
Desafio
Difícil- Em
PowerUp, adicionepublic enum Kind { Wide, Multiball }epublic Kind kind(cada prefab define seu tipo). AdicioneOnTriggerEnter: quando o power-up tocar no objeto marcado com a tagPaddle, um do tipo Wide chamaWiden()no scriptPaddledesse objeto, e qualquer um dos tipos destrói o power-up. - Em
Paddle, adicionepublic float wideFactor = 1.6fepublic float wideSeconds = 8f, e armazene a largura normal do paddle, sua escala em x, emAwake(). - Escreva
public void Widen(): ele inicia uma coroutine que define a escala em x do paddle comowideFactorvezes a largura normal, aguardawideSecondse 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);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.