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ò.
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.