Menu
CoddyTech

Paleta ancha

Lección 14 de 16 del curso Juego en Unity: Rompebloques de Coddy.

Una mejora Wide atrapada con la pala la hace más ancha durante unos segundos. La mejora detecta la captura: su collider de activación toca el collider de la pala, y ambos cuerpos son cinemáticos, lo cual basta para OnTriggerEnter. También atraviesa la pelota mientras cae, así que comprueba la etiqueta. Un enum con los tipos, configurado para cada prefab en el Inspector, distingue una mejora de otra.

Un efecto temporizado es una corrutina: cambiar, esperar, volver a cambiar. Una segunda captura mientras la primera sigue en ejecución debe iniciar el tiempo de nuevo, así que guarda la Coroutine que devuelve StartCoroutine y detenla antes de iniciar una nueva. De lo contrario, la primera termina antes de tiempo y deshace la segunda. Una mejora de velocidad:

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

La mejora establece la velocidad a partir de normalSpeed, guardada una sola vez, en lugar de duplicar la velocidad actual y reducirla a la mitad después: dos mejoras seguidas la harían ir 4 veces más rápido. El límite de la pala ya consulta su anchura en cada paso, así que una pala ancha sigue deteniéndose en las paredes.

challenge icon

Desafío

Difícil
  1. En PowerUp, agrega public enum Kind { Wide, Multiball } y public Kind kind (cada prefab establece su tipo). Agrega OnTriggerEnter: cuando el potenciador toca el objeto etiquetado como Paddle, uno de tipo Wide llama a Widen() en el script Paddle de ese objeto, y ambos tipos destruyen el potenciador.
  2. En Paddle, agrega public float wideFactor = 1.6f y public float wideSeconds = 8f, y guarda el ancho normal de la paleta, su escala en x, en Awake().
  3. Escribe public void Widen(): inicia una corrutina que establece la escala en x de la paleta en wideFactor veces el ancho normal, espera wideSeconds y vuelve a establecer el ancho normal. Si se recoge otro potenciador mientras la paleta está ensanchada, se reinicia el tiempo.

Por ahora, recoger un potenciador Multiball no hace nada.

Pulsa Play, recoge un potenciador verde y luego pulsa Check.

Pruébalo tú mismo

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // las caras interiores de las paredes laterales están en -wallX y 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego en Unity: Rompebloques