2017-01-29 3 views
0

J'ai un personnage dans Unity que j'utilise un raycast pour le faire sauter. Mais même quand la raycast ne frappe pas le sol (je peux voir le rayon avec la sortie de débogage), le joueur peut toujours sauter. Des idées pour lesquelles le rayon pense toujours qu'il entre en collision? Est-ce que le rayon pourrait frapper mon collisionneur de caractères, l'amenant à être vrai? J'ai été la recherche en ligne pendant des heures et rien que je trouve est en train de corriger la situation. Voici mon code:Unity Raycast retourne toujours vrai

void FixedUpdate() 
{ 
    Ray ray = new Ray(); 
    RaycastHit hit; 
    ray.origin = transform.position; 
    ray.direction = Vector3.down; 
    bool output = Physics.Raycast(ray, out hit); 
    Debug.DrawRay(ray.origin, ray.direction, Color.red); 
    if (Input.GetKey(KeyCode.Space) && output) 
    { 
     r.AddForce(Vector3.up * 1f, ForceMode.VelocityChange); 

    } 

} 
+0

Avez-vous essayé de déplacer le 'ray.origin' à l'extérieur de votre collisionneur de personnage? – Kolichikov

+0

Oui, donc quand je mets le rayon inférieur (en dessous du caractère et du sol) il n'y a pas de saut, ce qui est logique. Mais je l'ai juste mis en dessous du personnage (toujours au-dessus du sol, aussi près que possible des pieds de personnages), il ne détecte jamais le sol et permet de sauter – SJR59

+0

aussi quand je mets le rayon au-dessus de mon personnage , il permet toujours de sauter ... – SJR59

Répondre

2

pourrait le rayon frappera mon collisionneur de personnage?

Oui, c'est possible.

C'est en fait un problème qui peut facilement être résolu avec Debug.Log.

Mettez Debug.Log("Ray Hit: " + hit.transform.name); dans l'instruction if et il affichera quel objet bloque le Raycast.

Si c'est effectivement le problème, this post décrit plusieurs façons de le réparer. Cette réponse et le code changent un peu parce que cette question concerne la 3D et non la 2D. Utilisez juste la couche. Mettez votre joueur dans le calque 9, alors le problème devrait disparaître.

void FixedUpdate() 
{ 
    int playerLayer = 9; 

    //Exclude layer 9 
    int layerMask = ~(1 << playerLayer); 


    Ray ray = new Ray(); 
    RaycastHit hit; 
    ray.origin = transform.position; 
    ray.direction = Vector3.down; 
    bool output = Physics.Raycast(ray, out hit, 100f, layerMask); 



    Debug.DrawRay(ray.origin, ray.direction, Color.red); 
    if (Input.GetKey(KeyCode.Space) && output) 
    { 
     r.AddForce(Vector3.up * 1f, ForceMode.VelocityChange); 
     Debug.Log("Ray Hit: " + hit.transform.name); 
    } 
} 
+0

Salut Merci! à partir de la sortie du journal de débogage, il frappait le collisionneur de caractères! Mais la correction de couche que vous avez mentionnée ne semble pas fonctionner, y a-t-il autre chose que de simplement remplacer mon code par le code ci-dessus? Dois-je "mettre" mon personnage dans le calque 9 d'une autre manière? – SJR59

+0

Créez un calque dans le calque 9, puis nommez-le "Lecteur". Sélectionnez votre personnage et le calque "Player". Quand je dis couche, je ne veux pas dire * Tag *. S'il vous plaît regarder [this] (https://unity3d.com/learn/tutorials/topics/interface-essentials/layers) vidéo youtube sur la création et le changement de couches. Lorsque cela est fait et ne fonctionne pas, s'il vous plaît augmenter «100f» à environ «800f» et voir ce qui se passe. – Programmer

+0

Vous pouvez également remplacer le «100» par «Mathf.Infinity» – Programmer