Como faço para um personagem capaz de andar nas paredes?


34

Estou tentando fazer com que um personagem se mova como uma aranha: Dada uma inclinação crescente que uma bola normalmente não seria capaz de rolar, a aranha se arrastava lentamente.

Da mesma forma, dada uma plataforma retangular no ar, em vez de cair ao alcançar a borda, a aranha continuaria, envolvendo-a e continuando pelo lado e depois por baixo da plataforma (eventualmente andando pelo perímetro da plataforma).

Examinei vários componentes 2D do Unity, com pouco sucesso. :(

A maioria dos limites de colisão do meu mundo é marcada por componentes 2D do Collider (que funcionam muito bem com uma bola simples afetada pela gravidade, mas menos com esse personagem de aranha).


11
Esse jogo: youtube.com/watch?v=ga4Zqq1tXa8 ("Spider" no PS1, joguei há muito tempo) pode ser uma fonte de inspiração.
Tigrou

Respostas:


43

Eu estava prestes a postar um link para o blog da Base de Asteróides no inimigo Walker quando notei o karmington já vinculado ao artigo do Gamasutra em um comentário.

Provavelmente vale a pena dar a isso um pouco mais de visibilidade e explicação, como resposta por si só.

Estou andando na luz do sol, o-oh!

O truque é o raycasts . Isso permite que seu código varra ao longo de uma linha em busca de uma colisão.

Para que o Walker se alinhe bem às superfícies, eles disparam dois raios no terreno, um do lado esquerdo do Walker e um do seu direito (linhas vermelhas e amarelas acima).

De cada objeto RaycastHit2D, você pode obter um vetor normal apontando perpendicular à superfície (linhas magenta e verde). Ao calcular a média dos normais dos dois acertos, você obtém uma orientação adequada para o seu personagem que é razoavelmente reflexiva do terreno subjacente (linha ciana).

Você pode aplicar uma força ao longo dessa linha de orientação para manter o personagem preso ao terreno (embora isso possa causar deslizamentos se o atrito for baixo) ou posicionar manualmente o personagem no ponto médio de interseção do raio, como é feito com o Walker.

Você desejará mesclar gradualmente a orientação do personagem para impedir que ele vibre ou pareça robótico (veja como o normal muda drasticamente quando o Walker cruza a esquina, mas o corpo se move suavemente).

Se você tiver cantos afiados em seu terreno, provavelmente desejará inclinar ligeiramente esses raios para dentro - para que, se a aranha passar pela borda de um penhasco de 90 graus, o raio saliente atingirá a face do penhasco.

A equipe da Base de Asteróides também dispara um raio curto na direção do movimento de Walker (não mostrado), que substitui o raio daquele lado se atingir o terreno. Isso garante que o caminhante não fique preso ao entrar em um canto côncavo de 90 graus.

De acordo com os documentos, o raycast 2D difere do 3D, pois detecta coletores nos quais o raio inicia. Isso me parece suspeito, mas se o seu teste confirmar isso, você usará uma layerMask para limitar os raios para detectar apenas colididores de terreno escalável.


Posso confirmar que os raycasts 2D detectarão colisores que contêm o ponto de partida do raycast. No entanto, isso pode ser facilmente filtrado, pois a primeira detecção sempre é retornada com uma distância de 0 e um oposto normal da direção do raycast.
XenoRo

2

Você precisará de um código personalizado para isso.

Basicamente, você precisa saber qual é o objeto mais próximo, como a plataforma em questão, e então encontrar a aresta mais próxima e o ponto mais próximo dessa aresta, e depois determinar a posição e a rotação da aranha a partir daí.

Não será fácil torná-lo realmente agradável, mas deve ser um bom desafio fazê-lo funcionar.


2
Aqui está um link muito bom, não tenho certeza se isso é exatamente adequado para o seu caso, mas talvez talvez ... gamasutra.com/blogs/AdamWinkels/20140220/211306/...
karmington
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.