Estou criando um jogo de parkour e me deparei com um problema. Há uma mecânica de corrida na parede, em que, se você estiver correndo na parede, a rotação do seu jogador fica travada no plano da parede. Isso funciona perfeitamente, desde que você acerte o lado esquerdo (oeste) da parede. Quando estiver no lado direito (leste) da parede, o jogador é virado na direção errada.
private void WallStick()
{
if (leftWall) wallNormal = leftWallHit.normal.y;
else if (rightWall) wallNormal = rightWallHit.normal.y;
if (leftWall) playerMovement.rotationScript.yRotation = wallNormal + 90f;
else if (rightWall) playerMovement.rotationScript.yRotation = wallNormal - 90f;
}
leftWall e rightWall são valores booleanos para ver em que direção a parede está para o jogador. Os acertos são raycasts. Todo o resto parece autoexplicativo, mas faça perguntas se necessário. Este código funciona perfeitamente como indicado, mas apenas se o jogador correr no lado oeste da parede.
Eu poderia dividir cada parede em 2 partes e atribuir uma layerMask para diferenciar qual lado o raio atinge, mas isso parece muito desajeitado e me faria redesenhar o mundo inteiro.
Alguma ideia?
No seu código:
wallNormal = leftWallHit.normal.y;
Você está usando incorretamente.y
(a componente vertical da normal da parede). A direção da parede deve ser determinada usando o plano horizontal, ou seja, as componentesX
eZ
da normal da parede, nãoY.
Em 3D, as normais da parede apontam para fora, perpendicularmente à superfície. O eixo Y é de cima para baixo, então não ajuda a determinar a orientação horizontal.
wallNormal agora é o normal completo
vector (Vector3)
, não apenasy.
Vector3.Cross(normal, Vector3.up)
indica a direção que você deve seguir ao correr na parede.Mathf.Atan2(x, z)
calcula o ângulo corretamente para todos os 360° ao redor.Mathf.Rad2Deg
converte radianos em graus, que é normalmente como sua rotação é definida.Por que o seu problema original de inversão estava acontecendo? No lado oeste, seu hack (+90/-90) "meio que" corrigiu a direção por sorte. No lado leste, o hack te inverteu, porque a matemática estava ignorando as direções X e Z.
O problema foi meu truque de + ou - 90 graus para obter a direção da parede frontal, que era para trás, no lado oposto da parede. Agradeço a Sanjay Nakate pela solução. Aqui está o código atualizado para quem tiver dúvidas: