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.
Sfida
Difficile- In
PowerUp, aggiungipublic enum Kind { Wide, Multiball }epublic Kind kind(ogni prefab imposta il proprio kind). AggiungiOnTriggerEnter: quando il power-up tocca l'oggetto con tagPaddle, quello di tipo Wide chiamaWiden()sullo scriptPaddledi quell'oggetto, ed entrambi i tipi distruggono il power-up. - In
Paddle, aggiungipublic float wideFactor = 1.6fepublic float wideSeconds = 8f, e memorizza la larghezza normale della racchetta, ovvero la sua scala x, inAwake(). - Scrivi
public void Widen(): avvia una coroutine che imposta la scala x della racchetta awideFactorvolte la larghezza normale, attendewideSecondse 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);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.