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.
Desafio
DifícilUm aprimoramento Wide deixa o paddle mais largo por 8 segundos.
- Em
Paddle, adicionepublic float wideFactor = 1.6f;epublic float wideSeconds = 8f;, e mantenha a escala x normal em Awake. - Widen() interrompe a coroutine em execução, se houver, e inicia uma: escala x igual a
wideFactorvezes a normal, aguardewideSecondse volte ao normal. - 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