J'ai remarqué un problème dans la vérification au sol du contrôleur à la troisième personne d'Unity.
La vérification au sol doit détecter si le joueur se tient ou non au sol. Pour ce faire, il envoie un rayon sous le lecteur.
Cependant, si le joueur se tient au-dessus et au milieu de deux cases et qu'il y a un espace entre ces cases, alors le rayon tire dans l'espace et le joueur pense qu'il n'est pas en contact avec le sol, ce qui ressemble à ceci:
Je suis incapable de bouger. Vous pouvez clairement voir que le rayon est dans l'espace et donc l'arbre de mélange aéroporté du joueur animateur est actif.
Quelle est la meilleure façon de résoudre ce problème?
Je pensais à filmer plusieurs rayons, de la même origine mais avec des angles différents. Et cela OnGround
ne devrait être vrai que si X% de ces rayons touchent le «sol». Ou existe-t-il une meilleure façon?
Debug.DrawLine
? C'est difficile à visualiser, je n'arrive pas à écrire le script.Je pense honnêtement que l'approche des "rayons multiples" est une assez bonne idée. Je ne les tirerais pas en angle cependant, je compenserais plutôt les rayons, quelque chose comme ceci:
Le joueur est le stickman bleu; Les flèches vertes représentent les rayons supplémentaires et les points oranges (RaycastHits) sont les points où les deux rayons frappent les cases.
Idéalement, les deux rayons verts devraient être placés juste sous les pieds du joueur, afin d'obtenir le plus de précision possible pour vérifier si le joueur est mis à la terre ou non;)
la source
Je pense que je l'ai résolu en passant
Physics.Raycast
àPhysics.SphereCast
dans le scriptThirdPersonCharacter.cs
. Mais il doit encore être testé.J'ai également dû commenter cette ligne qui modifiait la
m_GroundCheckDistance
valeur, sinon il y avait un glissement bizarre sur certains modèles:Et j'ai changé
m_GroundCheckDistance = 0.1f;
pourm_GroundCheckDistance = m_OrigGroundCheckDistance;
:Script entier:
la source
Pourquoi ne pas utiliser la fonction OnCollisionStay d'Unity ?
Avantages:
Vous n'avez pas à créer de raycast.
C'est plus précis que raycast: Raycast est une méthode de prise de vue à vérifier, si votre prise de vue raycast n'est pas suffisamment couverte, cela conduit à un bug qui est la raison pour laquelle vous avez posé cette question.
OnCollisionStay
La méthode vérifie littéralement si quelque chose est en contact - elle convient parfaitement au but, vérifiant si le joueur touche le sol (ou tout ce sur quoi le joueur peut atterrir).Pour le code et la démo, vérifiez cette réponse: http://answers.unity.com/answers/1547919/view.html
la source