Menu
CoddyTech

Racchetta larga

Lezione 14 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.

Un potenziamento che allarga la racchetta la rende più larga per alcuni secondi quando viene raccolto con la racchetta. Il potenziamento rileva la raccolta: il suo collider trigger tocca il collider della racchetta ed entrambi i corpi sono cinematici, il che basta per OnTriggerEnter. Anche la palla lo attraversa mentre scende, quindi controlla il tag. Un enum con i tipi, impostato per ogni prefab nell'Inspector, permette di distinguere un potenziamento dall'altro.

Un effetto temporizzato è una coroutine: cambia, aspetta, cambia di nuovo. Se viene raccolto un secondo potenziamento mentre il primo effetto è ancora attivo, il tempo deve ripartire da capo, quindi conserva la Coroutine restituita da StartCoroutine e interrompila prima di avviarne una nuova. Altrimenti la prima coroutine termina in anticipo e annulla il secondo effetto. Un potenziamento della velocità:

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

Il potenziamento imposta la velocità a partire da normalSpeed, memorizzata una sola volta, invece di raddoppiare la velocità attuale e dimezzarla in seguito: due potenziamenti consecutivi la renderebbero 4 volte più alta. Il limite della racchetta legge già la sua larghezza a ogni passo, quindi una racchetta più larga si ferma comunque contro le pareti.

challenge icon

Sfida

Difficile
  1. In PowerUp, aggiungi public enum Kind { Wide, Multiball } e public Kind kind (ogni prefab imposta il proprio kind). Aggiungi OnTriggerEnter: quando il power-up tocca l'oggetto con tag Paddle, quello di tipo Wide chiama Widen() sullo script Paddle di quell'oggetto, ed entrambi i tipi distruggono il power-up.
  2. In Paddle, aggiungi public float wideFactor = 1.6f e public float wideSeconds = 8f, e memorizza la larghezza normale della racchetta, ovvero la sua scala x, in Awake().
  3. Scrivi public void Widen(): avvia una coroutine che imposta la scala x della racchetta a wideFactor volte la larghezza normale, attende wideSeconds e ripristina la larghezza normale. Se la racchetta raccoglie un altro power-up mentre è larga, il timer riparte.

Un power-up Multiball viene raccolto, ma per ora non fa nulla.

Premi Play, raccogli un power-up verde, quindi premi Check.

Provalo tu

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // le facce interne delle pareti laterali si trovano a -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);
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Rompi-mattoni