Percebi um problema na verificação de solo do controlador de terceira pessoa do Unity.
A checagem no solo deve detectar se o jogador está ou não no chão. Para isso, envia um raio sob o player.
No entanto, se o jogador estiver em cima e no meio de duas caixas e houver um espaço entre essas caixas, o raio disparará para o espaço e o jogador pensará que não está em contato com o chão, que se parece com o seguinte:
Eu sou incapaz de me mover. Você pode ver claramente que o raio está no espaço e, assim, a árvore de mistura aerotransportadora do animador do jogador está ativa.
Qual é a melhor maneira de resolver esse problema?
Eu estava pensando em disparar vários raios, da mesma origem, mas com ângulos diferentes. E OnGround
só deve ser verdade se X% desses raios atingirem o "solo". Ou há um jeito melhor?
fonte
Debug.DrawLine
? É difícil visualizar, não consigo escrever o script.Sinceramente, acho que a abordagem dos "raios múltiplos" é uma boa idéia. Eu não as atiraria em ângulo, mas sim compensaria os raios, algo como isto:
O jogador é o stickman azul; As setas verdes representam os raios adicionais e os pontos laranja (RaycastHits) são os pontos em que os dois raios atingem as caixas.
Idealmente, os dois raios verdes devem ser posicionados logo abaixo dos pés do jogador, a fim de obter a maior precisão possível para verificar se o jogador está aterrado ou não;)
fonte
Acho que resolvi alterando
Physics.Raycast
paraPhysics.SphereCast
no scriptThirdPersonCharacter.cs
. Mas ainda precisa de testes.Eu também tive que comentar essa linha que estava alterando o
m_GroundCheckDistance
valor, caso contrário, houve alguns deslizamentos estranhos em alguns modelos:E eu mudei
m_GroundCheckDistance = 0.1f;
param_GroundCheckDistance = m_OrigGroundCheckDistance;
:Script inteiro:
fonte
Por que não usar a função OnCollisionStay do Unity ?
Prós:
Você não precisa criar raycast.
É mais preciso que o raycast: o Raycast é um método de disparar para verificar, se o seu disparo com raycast não é cobertura suficiente, isso leva a um bug, razão pela qual você fez esta pergunta.
OnCollisionStay
O método literalmente verifica se algo está tocando - ele se encaixa perfeitamente para o objetivo de verificar se o jogador está tocando o chão (ou qualquer coisa em que o jogador possa pousar).Para código e demonstração, verifique esta resposta: http://answers.unity.com/answers/1547919/view.html
fonte