2015-06-13 33 views
6

Ho un progetto Unity in cui esiste un mondo di gioco 2D costituito da collisori statici per rendere la geometria solida ai personaggi che la abitano. Il giocatore è un collisore dinamico (con un corpo rigido non cinematico). C'è anche un personaggio nemico che è anche un collisore dinamico. Entrambi i personaggi camminano sul pavimento e sbattono contro muri come mi aspetterei che loro.Crea due oggetti fisici non in collisione ma rileva collisioni in Unity

Quello che voglio ottenere è che il giocatore e il nemico non sono solidali l'uno con l'altro, in modo che possano muoversi l'uno attraverso l'altro. Ho raggiunto questo mettendo il nemico e il giocatore su livelli separati e impostando la matrice di collisione in modo che questi strati non entrino in collisione tra loro. Il problema che sto avendo ora, tuttavia, è che voglio rilevare se il nemico e il giocatore si incontrano o meno. Ho aggiunto un collisore del grilletto al personaggio nemico, è sul livello nemico, il che significa che non rileva collisioni con il giocatore.

Ho pensato di creare un sub-gameobject per il nemico, metterlo sul livello del giocatore, aggiungere un corpo rigido e innescare il collisore e usarlo per rilevare le collisioni tra il giocatore e il nemico, ma è così contorto che mi fa pensare se non ci sia una soluzione più elegante per questo.

risposta

3

Sì, è necessario creare un bambino GameObject, con un collettore di trigger e inserirlo in un livello che interagisce con il livello giocatore.

No, non è necessario aggiungere un Rigidbody al nuovo GameObject, il corpo rigido del genitore lo rende già un collisore dinamico, quindi otterrete gli eventi OnTrigger.

Come nota a margine, solo per mantenere le cose organizzate, se si crea un figlio del nemico non metterlo nel livello giocatore. Ad esempio, in futuro potrebbe essere necessario disabilitare la collisione tra livelli del giocatore con se stesso. Inoltre, se il tuo giocatore interagisce in questo modo con molti oggetti, metterei un singolo trigger sul giocatore invece che sui nemici, su un livello separato PlayerTrigger, solo per mantenere le cose semplici.

Non c'è un modo più semplice? Non proprio. Hai sicuramente bisogno di non interazione tra il giocatore e i collisori nemici, ma anche qualche tipo di interazione tra di loro. Quindi uno di loro deve estendersi su due livelli, o l'intera interazione sarebbe descritta da un singolo bool. Il motore fisico elabora molte informazioni in un colpo solo, in modo da poter impostare tutti i livelli e le collisioni che si desidera, ma durante il ciclo fisico non si ha più controllo su ciò che accade. Non puoi dire al motore di ignorare le collisioni tra solo due oggetti. Avendo solo 32 livelli, e facendoli comportare nel modo in cui lo fanno in realtà sono pesanti ottimizzazioni. Se sei preoccupato per le prestazioni per la creazione di un altro livello, disabilita l'interazione tra i livelli non necessari, come il livello trigger e il pavimento e le pareti, o i livelli che non toccano nemmeno.

L'alternativa sta facendo tutto in base al codice, che è ancora meno elegante. Una capsula figlio singolo sul lettore non sembra così male ora, vero?

+0

Ho fatto quello che hai detto e funziona correttamente. Non avevo davvero pensato di mettere il grilletto sul giocatore, quindi tutti i miei nemici possono rimanere senza grilletto. Salva un sacco di problemi. – Jerry