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…

3 pensieri su “I Colliders

  1. Per prima cosa: Grazie! Portale fantastico e spiegazioni chiarissime!
    Purtroppo sono una principiante e a volte ho dubbi basic: se ad un oggetto assegno un collider e spunto al collider il parametro “is trigger” non ci sarà collisione, giusto?
    E se ad un oggetto assegno un collider ma senza il componente RigidBody non si produce lo stesso effetto: nessuna collisione?

    1. Ciao Alice.
      Come hai capito un collider con “isTrigger” non dermina una collisione e può essere considerato come “un’area sensibile” che intercetta il contatto con altri colliders (che siano trigger o no). Gli oggetti lo attraverseranno come se non esistesse innescando la funzione “OnTriggerEnter()” senza fare altro se non specificato.

      Non è necessario che tutti i gameObjects con colliders posseggano un RigidBody, per esempio un muro, il pavimento ecc… non necessitano di un RigidBody.
      I RigidBody servono solo su quegli oggetti che dovranno risentire di forze (una cassa che se colpita si deve spostare ecc…). Un muro per esempio non si dovrà spostare ed è sufficiente che abbia un collider, senza RigidBody. Per far si che un muro non sia attraversabile il suo collider dovrà essere “normale” cioè senza la spunta su “isTrigger”.

Lascia un commento

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