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.
Desafío
Difícil- En
PowerUp, agregapublic enum Kind { Wide, Multiball }ypublic Kind kind(cada prefab establece su tipo). AgregaOnTriggerEnter: cuando el potenciador toca el objeto etiquetado comoPaddle, uno de tipo Wide llama aWiden()en el scriptPaddlede ese objeto, y ambos tipos destruyen el potenciador. - En
Paddle, agregapublic float wideFactor = 1.6fypublic float wideSeconds = 8f, y guarda el ancho normal de la paleta, su escala en x, enAwake(). - Escribe
public void Widen(): inicia una corrutina que establece la escala en x de la paleta enwideFactorveces el ancho normal, esperawideSecondsy 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);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.