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.
Desafío
DifícilUna mejora de anchura hace que la paleta sea más ancha durante 8 segundos.
- En
Paddle, añadepublic float wideFactor = 1.6f;ypublic float wideSeconds = 8f;, y conserva la escala x normal en Awake. - Widen() detiene la corrutina que esté en ejecución, si la hay, y comienza una: escala x igual a
wideFactorpor la escala normal, esperawideSecondsy vuelve a la normal. - 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