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.
Sfida
DifficileUn potenziamento Wide rende la racchetta più larga per 8 secondi.
- In
Paddle, aggiungipublic float wideFactor = 1.6f;epublic float wideSeconds = 8f;, e conserva la scala x normale in Awake. - Widen() arresta la coroutine in esecuzione, se presente, e ne avvia una: scala x pari a
wideFactorvolte quella normale, attesa diwideSeconds, poi di nuovo normale. - 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
4Potenziamenti
CaduteEsercitati da solo: Playground Unity