J'étais sur le point de publier un lien vers le blog de la base Asteroid sur l'ennemi Walker lorsque j'ai remarqué que Karmington était déjà lié à l' article de Gamasutra dans un commentaire.
Cela vaut probablement la peine de donner à cela un peu plus de visibilité et d’explication comme une réponse à part entière.
L'astuce est la diffusion de rayons . Ceux-ci permettent à votre code de parcourir une ligne pour une collision.
Pour que le Walker s’aligne bien sur les surfaces, il tire deux rayons sur le terrain, l’un du côté gauche du Walker et l’autre du côté droit (lignes rouge et jaune au-dessus).
À partir de chaque objet RaycastHit2D, vous pouvez obtenir un vecteur normal pointant perpendiculairement à la surface (lignes magenta et verte). En faisant la moyenne des normales des deux coups, vous obtenez une orientation adaptée à votre personnage qui reflète raisonnablement le terrain sous-jacent (ligne cyan).
Vous pouvez appliquer une force le long de cette ligne d'orientation pour que le personnage reste collé au terrain (bien que cela puisse causer un glissement si le frottement est faible), ou positionner manuellement le personnage au point d'intersection du rayon moyen, comme pour le Walker.
Vous aurez envie de mélanger progressivement l'orientation du personnage pour empêcher votre personnage de vibrer ou de paraître robotique (voyez comment la normale change brusquement lorsque le Walker croise le coin, mais que le corps bouge doucement).
Si vous avez des virages serrés sur votre terrain, vous voudrez probablement incliner légèrement ces rayons vers l'intérieur. Ainsi, si l'araignée passe au-delà du bord d'une falaise à 90 degrés, le rayon en surplomb atteindra la paroi de la falaise.
L’équipe de la base des astéroïdes tire également un rayon court dans la direction du mouvement du marcheur (non illustré), qui a priorité sur le rayon de ce côté s’il heurte le terrain. Cela garantit que le marcheur ne reste pas coincé lorsqu'il marche dans un coin concave à 90 degrés.
Selon la documentation, la diffusion de rayons 2D diffère de la présentation 3D en ce sens qu'elle détecte les collisionneurs dans lesquels le rayon commence. Cela me semble louche, mais si vos tests le confirment, vous souhaiterez utiliser un masque de couches pour limiter le nombre de rayons afin de détecter uniquement les collisionneurs de terrain pouvant être escaladés.