Imparare Unity

I Colliders

Il componente Collider è necessario per tutti quegli oggetti che dovranno avere un volume non “attraversabile” oppure per tutte quelle aree in cui dovremmo rilevare l’entrata/uscita/stazionamento di altri oggetti.
In realtà, Collider è la classe base da cui sono ereditati tutti i vari tipi di colliders, ognuno dei quali ha una forma diversa come BoxCollider, SphereCollider, e così via, o una combinazione di questi a seconda della forma dell’oggetto.

Infatti le aree di collisione di un oggetto non devono per forza corrispondere come forma alla geometria reale di un oggetto. Per avere una reazione più performante del gioco, l’ideale sarebbe avere meno colliders possibili e dalle forme più regolari possibile.

Se dovesse servire una collisione più precisa, Unity mette a disposizione il componente MeshCollider, che potrà avere una forma arbitraria a seconda di un modello assegnato. Da considerare però che meno poligoni possiede un MeshCollider e migliori saranno le prestazioni e che , i colliders di base sono molto più leggeri da calcolare.

Per ora vediamo i colliders di base.

Una volta assegnato un collider ad un gameObject esso rileverà le collisioni con gli altri colliders ed avrà a disposizione tre eventi :

  • OnCollisionEnter per rilevare l’entrata in collisione
  •  OnCollisionExit per l’uscita da una collisione
  • OnCollisionStay per rilevare un contatto continuo tra due colliders
 void OnCollisionEnter(Collision coll)
{
 
        Destroy(gameObject); //Distrugge il gameObject di questo collider
        Destroy(coll.gameObject); //Distrugge anche il gameObject con cui ha colliso
    
}

I metodi OnCollision hanno come parametro in entrata una variabile di tipo Collision che contiene molte informazioni sulla collisione appena avvenuta, come il collider che ha colpito questo oggetto, il punto esatto della collisione e molti altri parametri.

ATTENZIONE:
 Se muoviamo un oggetto modificando le coordinate del suo transform, per rilevarne le collisioni sarà necessario comunque assegnare ad esso un rigidBody o in alternativa, muoverli con le funzioni AddForce del RigidBody.
In una collisione, almeno uno dei due oggetti deve possedere un RigidBody.

 

 Triggers

Uno dei parametri più importanti dei collider è la spunta Is Trigger.
Se Is Triggerè selezionato, le collisioni non reagiranno nello stesso modo, anzi, sarebbe più corretto dire che le collisioni non ci saranno affatto ma verrà rilevata l’entrata, l’uscita e lo stazionamento all’interno di quel collider di tipo trigger.
Infatti, i trigger non emettono i tre eventi visti sopra, ma la controparte trigger, ovvero: 

  • OnTriggerEnter
  • OnTriggerExit
  • OnTriggerStay

Questi messaggi funzionano in modo molto simile alle OnCollision, ma posseggono un parametro in entrata di tipo Collider (ovvero il collider che ha toccato l’oggetto) invece che Collision. Per questo motivo contengono meno informazioni e per questo sono anche più leggere da calcolare delle controparti OnCollision.

Poniamo di avere un gameObject con un collider di tipo trigger tipo questo:

Come si può notare, non abbiamo bisogno ne di un Mesh Render ne di un Mesh Filter. Si tratta solo di quella che potremmo definire una trigger area.

 //Entrata in contatto con qualsiasi altro collider
 void OnTriggerEnter(Collider otherCollider)
{
    
    
    
    //Se il collider che entra in contatto con questo trigger ha il tag "Player"
    if(otherCollider.gameObject.tag == "Player")
    {
        //Scrivi sulla console questo messaggio
        print("Il Player è entrato in area")
    }
    
    
     //Se il collider che entra in contatto con questo trigger ha il tag "Nemico"
    if(otherCollider.gameObject.tag == "Nemico")
    {
        //Scrivi sulla console questo messaggio
        print("Un Nemico è entrato in area")
    }
    
    
}

Potremmo così rilevare l’entrata in quell’area del Player o di un nemico, o di qualsiasi altro oggetto, tramite il suo tag o il nome dell’oggetto o qualsiasi altro parametro avremmo a disposizione.

Escludere le collisioni tramite i Layers

Unity ci pemette di escludere determinate collisioni tra i diversi layers così da alleggerire molto i calcoli della fisica.

Sul menu, potete scegliere le matrici di collisioni andando su:
Edit > Project Settings > Physics.


S
otto Collision Matrix troveremo una matrice che permette di decidere per ogni layer, con quali layer Unity deve effettivamente rilevare le collisioni, e quali invece ignorare.
Potremmo per esempio escludere il layer del Player e quello dei proiettili dello stesso Player o dei suoi alleati ecc…

Un pensiero su “I Colliders

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *