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

pyko
fonte
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.

DMGregory
fonte
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.

Karmington
fonte
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