Comment faire un personnage capable de marcher sur les murs?

34

J'essaie de faire bouger un personnage comme une araignée: dans une pente montante qu'une balle ne serait normalement pas capable de rouler, l'araignée ramperait lentement.

De même, avec une plate-forme rectangulaire dans les airs, au lieu de tomber en atteignant le bord, l'araignée continuerait, s'enroulant sur le bord et continuerait sur le côté puis sous la plate-forme (en marchant finalement autour du périmètre de la plate-forme).

J'ai étudié divers composants d'Unity 2D, sans grand succès. :(

La plupart des frontières de collision de mon monde sont marquées par des composants 2D Collider (qui fonctionnent très bien avec une simple balle affectée par la gravité, mais moins avec ce personnage en forme d'araignée).

pyko
la source
1
Ce jeu: youtube.com/watch?v=ga4Zqq1tXa8 ("Spider" sur PS1, que je jouais il y a longtemps) pourrait être une source d'inspiration.
Tigrou

Réponses:

43

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.

Je marche sur Rayshine, o-oh!

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.

DMGregory
la source
Je peux confirmer que les émissions de rayons 2D détecteront les collisionneurs contenant le point de départ de l'émission. Cela peut cependant être facilement filtré, car cette première détection est toujours renvoyée avec une distance de 0 et une normale opposée à la direction du raycast.
XenoRo
2

Vous aurez besoin d'un code personnalisé pour cela.

Fondamentalement, vous devez savoir quel est l'objet le plus proche, comme la plate-forme en question, puis trouver le bord le plus proche et le point le plus proche sur ce bord, puis déterminer la position et la rotation de l'araignée à partir de là.

Ce ne sera pas facile de le rendre vraiment agréable, mais ce devrait être un bon défi de le faire fonctionner du tout.

Karmington
la source
2
Voici un lien vraiment sympa, je ne sais pas si cela convient parfaitement à votre cas, mais peut-être peut-être ... gamasutra.com/blogs/AdamWinkels/20140220/211306/…
karmington