Menu
CoddyTech

Racchetta larga

Lezione 16 di 19 del corso Gioco in Unity: Rompi i mattoni di Coddy.

Un effetto temporizzato è una coroutine: cambia, aspetta, cambia di nuovo. Una seconda presa mentre la prima è in corso deve far ripartire il tempo, quindi conserva la Coroutine restituita da StartCoroutine e interrompila prima di avviarne una nuova. Altrimenti la prima termina in anticipo e annulla la seconda. Un aumento della velocità:

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

Imposta la velocità a partire da normalSpeed, salvata una sola volta, invece di raddoppiare la velocità attuale: due aumenti di fila la renderebbero 4 volte più alta. Il limite della racchetta legge la sua larghezza a ogni passaggio, quindi anche una racchetta larga si ferma contro le pareti.

challenge icon

Sfida

Difficile

Un potenziamento Wide rende la racchetta più larga per 8 secondi.

  1. In Paddle, aggiungi public float wideFactor = 1.6f; e public float wideSeconds = 8f;, e conserva la scala x normale in Awake.
  2. Widen() arresta la coroutine in esecuzione, se presente, e ne avvia una: scala x pari a wideFactor volte quella normale, attesa di wideSeconds, poi di nuovo normale.
  3. La coroutine richiede using System.Collections;.

Premi «Gioca» e prendi un potenziamento verde: la racchetta si allarga, poi torna alle dimensioni iniziali. Poi premi «Verifica».

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

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

Tutte le lezioni di Gioco in Unity: Rompi i mattoni

Esercitati da solo: Playground Unity