Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 21 di 31
  • livello principiante
Indice lezioni

Come creare un collezionabile che produce un suono

In molti platform possiamo raccogliere degli oggetti che aumentano il nostro punteggio. Vediamo come impostare un suono per un collezionabile.
In molti platform possiamo raccogliere degli oggetti che aumentano il nostro punteggio. Vediamo come impostare un suono per un collezionabile.
Link copiato negli appunti

Che cosa sarebbe un platform senza i collezionabili? Proprio come le monete di Super Mario Bros., si tratta di oggetti disseminati lungo il territorio di gioco, che una volta raccolti aumentano il punteggio o ci offrono dei poteri. Andremo quindi a creare in Unity il comportamento di uno di questi oggetti. Come sempre, quello che vediamo a schermo è un oggetto che dev'essere trasformato in Sprite tramite il menu Inspector, e solo a quel punto potremo importarlo nella scena tramite drag and drop. Possiamo posizionare i collezionabili dove vogliamo, ma vedremo più avanti nel dettaglio come gestire il level design. Il comportamento che intendiamo ottenere è il seguente: quando il giocatore entra in contatto con il collezionabile, questo deve sparire. Creiamo quindi un nuovo Componente contenente il codice, dove inseriremo le seguenti righe. Fate attenzione a nominare il file come indicato, ossia CollectibleScript. La public class all'inizio dello script deve avere inoltre lo stesso esatto nome, CollectibleScript, altrimenti riceveremo un messaggio di errore. Ne approfittiamo anche per definire una semplice regola di sintassi, ossia che i nomi delle classi devono iniziare con una maiuscola, altrimenti anche in questo caso il compilatore ci avviserà di un errore.

using UnityEngine;
using System.Collections;
 
public class CollectibleScript: MonoBehaviour {
 
  // Use this for initialization
  void Start() {
 
  }
 
  // Update is called once per frame
  void Update() {
 
  }
 
  void OnTriggerEnter2D(Collider2D other) {
    if (other.tag == "Player") {
      Destroy(gameObject);
    }
  }
}

Osserviamo un secondo queste righe di codice: il cuore del comportamento è sicuramente il comando onTriggerEnter2D, che serve a rilevare quando il giocatore entra in collisione con un determinato oggetto. Abbiamo deciso, in questo caso, che quando ciò avviene l'oggetto a cui è applicato lo script, ossia il gameObject, venga distrutto: il codice, non a caso, contiene l'istruzione Destroy(gameObject). In questo modo ricreiamo una dinamica del tutto simile a quando si raccolgono le monete in Super Mario Bros. Naturalmente possiamo usare l'onTriggerEnter anche in altri frangenti, nonché in contesti 3D. Immaginate, per esempio, la classica azione di un personaggio che entra in una stanza: usando l'onTriggerEnter, potrete far caricare tale ambientazione.

Figura 1. (click per ingrandire)


Aggiungere un suono a un'azione con AudioClip

Volendo, possiamo anche attribuire un suono compiuto da questo oggetto, che si attiva quando si verifica la collisione. Per farlo, aggiungiamo un semplice asset sonoro nella scena (ne troviamo tantissimi su siti come OpenGameArt), cliccando come sempre su Import New Asset nell'apposita finestra. Il comportamento che vogliamo ottenere è il seguente: quando si entra in collisione con un oggetto, questo si distrugge, ma allo stesso tempo viene prodotto un suono. Si tratta, in realtà, di un esempio interessante e un po' paradossale: l'oggetto che distruggiamo, infatti, porta con sé il suono, e se lo distruggiamo, non sarà più possibile che tale suono venga riprodotto. Per questo motivo, ogni tentativo di scrivere codice che esegue le due operazioni in sequenza sarà vano ai nostri fini. Aggiorniamo quindi il codice come indicato di seguito e vediamo insieme come risolvere questo dilemma.

using UnityEngine;
using System.Collections;
 
public class CollectibleScript: MonoBehaviour {
  public AudioClip suonoraccolta;
 
  // Use this for initialization
  void Start() {
 
  }
 
  // Update is called once per frame
  void Update() {
 
  }
 
  void OnTriggerEnter2D(Collider2D other) {
    if (other.tag == "Player") {
      AudioSource.PlayClipAtPoint(suonoraccolta, new Vector3(5, 1, 2));
      Destroy(gameObject);
    }
  }
}

Innanzitutto, all'inizio del codice abbiamo dichiarato una variabile pubblica, suonoraccolta, che in Unity all'atto pratico significa che potremo gestirla tramite interfaccia. E infatti, se ora ispezioniamo il GameObject collectible, e ci spostiamo al component Collectible Script, troviamo un nuovo campo vuoto, dal nome appunto di suonoraccolta, che dovremo riempire con il file sonoro, chiamato nel nostro esempio “prova”.

Figura 2. (click per ingrandire)


La gestione delle collisioni è rimasta invariata anche nello script aggiornato, ma questa volta prima del comando Destroy(gameObject) troviamo una nuova istruzione, ossia AudioSource.PlayClipAtPoint. Questa funzione non soltanto riproduce un determinato suono (in questo caso, la clip suonoraccolta), ma in questo processo crea automaticamente un GameObject per poi cancellarlo immediatamente dopo averlo riprodotto. Appare quindi in maniera lampante come questo sia esattamente il tipo di script che risponde alla nostra esigenza. E infatti, se attiviamo la modalità Game, non solo il collezionabile scomparirà non appena lo tocchiamo, ma nello stesso frangente si attiverà anche il suono che abbiamo impostato. All'inizio della guida avevamo accennato alla possibilità di aumentare il punteggio: dovremo quindi creare una variabile per lo “score”, e far sì che a ogni collisione si aggiunga un punto a tale variabile. Dichiareremo quindi all'inizio della classe la variabile numerica (integer) coinValue, che imposteremo a 1:

public int coinValue = 1;

Poi, prima di tutti i comportamenti che si verificano quando avviene una collisione, ossia il Destroy e il suono, aggiungeremo una funzione che incrementa la variabile pubblica coinValue:

ScoreManager.score += coinValue;

Ti consigliamo anche