Come faccio a rendere un personaggio capace di camminare sui muri?


34

Sto cercando di far muovere un personaggio come un ragno: data una pendenza crescente che una palla normalmente non sarebbe in grado di arrotolare, il ragno striscia lentamente.

Allo stesso modo, data una piattaforma rettangolare a mezz'aria, invece di cadere quando raggiunge il bordo, il ragno continuerebbe, avvolgendosi sul bordo e continuando lungo il lato e quindi sotto la piattaforma (eventualmente camminando attorno al perimetro della piattaforma).

Ho esaminato vari componenti Unity 2D, con scarso successo. :(

La maggior parte dei confini della collisione del mio mondo sono contrassegnati dai componenti Collider 2D (che funzionano alla grande con una semplice palla colpita dalla gravità, ma meno con questo personaggio ragno).


1
Quel gioco: youtube.com/watch?v=ga4Zqq1tXa8 ("Spider" su PS1, l'ho giocato molto tempo fa) potrebbe essere fonte di ispirazione.
Tigrou,

Risposte:


43

Stavo per pubblicare un link al blog Asteroid Base sul nemico Walker quando ho notato che Karmington era già collegato all'articolo Gamasutra in un commento.

Probabilmente vale la pena dare a questo un po 'più di visibilità e spiegazione come una risposta a sé stante però.

Sto camminando sul rayhine, o-oh!

Il trucco sono i raycast . Questi permettono al tuo codice di scansionare lungo una linea per una collisione.

Per consentire al Walker di allinearsi perfettamente alle superfici, sparano due raggi sul terreno, uno dalla parte sinistra del Walker e uno dalla sua destra (linee rosse e gialle sopra).

Da ogni oggetto RaycastHit2D, è possibile ottenere un vettore normale che punta perpendicolarmente alla superficie (magenta e linee verdi). Mediando la media delle normali dai due colpi, ottieni un orientamento adatto per il tuo personaggio che è ragionevolmente riflettente del terreno sottostante (linea ciano).

Puoi applicare una forza verso il basso lungo questa linea di orientamento per mantenere il personaggio bloccato sul terreno (anche se ciò può causare uno scivolamento se l'attrito è basso), oppure posizionare manualmente il personaggio sul punto di intersezione del raggio medio come viene fatto con il Walker.

Ti consigliamo di fondere gradualmente l'orientamento del personaggio per evitare che il tuo personaggio vibri o sembri robotico (vedi come la normale cambia bruscamente quando il Walker attraversa l'angolo, ma il corpo si muove senza intoppi).

Se hai angoli acuti nel tuo terreno, probabilmente vorrai inclinare leggermente questi raggi verso l'interno - in modo che se il ragno passi oltre il bordo di una scogliera di 90 gradi, il raggio sporgente colpirà la parete della scogliera.

La squadra della Base Asteroide lancia anche un raggio corto nella direzione del movimento del Walker (non mostrato), che sovrascrive il raggio su quel lato se colpisce il terreno. Ciò garantisce che il camminatore non rimanga bloccato quando cammina in un angolo concavo di 90 gradi.

Secondo i documenti, il raycast 2D differisce da quello 3D in quanto rileva i collider all'interno dei quali inizia il raggio. Mi sembra strano, ma se i tuoi test lo confermano, ti consigliamo di utilizzare un layerMask per limitare i raggi in modo da rilevare solo i collider dei terreni scalabili.


Posso confermare che i raycast 2D rileveranno collider che contengono il punto di partenza del raycast. Questo può essere facilmente filtrato, tuttavia, poiché quel primo rilevamento viene sempre restituito con una distanza pari a 0 e un normale opposto della direzione del raycast.
XenoRo,

2

Per questo avrai bisogno di un codice personalizzato.

Fondamentalmente è necessario sapere qual è l'oggetto più vicino, come la piattaforma in questione, quindi trovare il bordo più vicino e il punto più vicino su quel bordo, quindi determinare la posizione e la rotazione del ragno da lì.

Non sarà facile renderlo davvero bello, ma dovrebbe essere una buona sfida farlo funzionare.


2
Ecco un link davvero carino, non sono sicuro che sia esattamente adatto al tuo caso, ma forse forse ... gamasutra.com/blogs/AdamWinkels/20140220/211306/…
Karmington
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.