Menu
CoddyTech

Paleta ancha

Lección 16 de 19 del curso Juego en Unity: Rompe ladrillos de Coddy.

Un efecto temporizado es una corrutina: cambiar, esperar, volver a cambiar. Si se recoge un segundo potenciador mientras el primero sigue activo, el tiempo debe empezar de nuevo, así que guarda la Coroutine que devuelve StartCoroutine y detenla antes de iniciar otra. De lo contrario, el primero termina antes de tiempo y deshace el segundo. Un aumento de velocidad:

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

Establece la velocidad a partir de normalSpeed, cuyo valor se guarda una sola vez, en lugar de duplicar la velocidad actual: dos potenciadores seguidos harían que fuera 4 veces más rápida. El límite de la paleta lee su anchura en cada paso, así que una paleta ancha sigue deteniéndose en las paredes.

challenge icon

Desafío

Difícil

Una mejora de anchura hace que la paleta sea más ancha durante 8 segundos.

  1. En Paddle, añade public float wideFactor = 1.6f; y public float wideSeconds = 8f;, y conserva la escala x normal en Awake.
  2. Widen() detiene la corrutina que esté en ejecución, si la hay, y comienza una: escala x igual a wideFactor por la escala normal, espera wideSeconds y vuelve a la normal.
  3. La corrutina necesita using System.Collections;.

Pulsa «Jugar» y atrapa una verde: la paleta crece y luego vuelve a encogerse. Después, pulsa «Comprobar».

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

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

Todas las lecciones de Juego en Unity: Rompe ladrillos

Practica por tu cuenta: Playground de Unity