2016-12-13 2 views
1

J'ai une fonction booléenne DirectPath simple qui est destinée à renvoyer vrai ou faux selon qu'il y a un mur entre 2 points.Utilisation de layerMasks avec Physic2D.Linecast() dans Unity C#

public bool DirectPath (Vector2 start, Vector2 end) { 

    RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8); 

    if (hitWall == null) { 
     Debug.Log ("Direct path returning true"); 
     return true; 
    } else { 
     Debug.Log ("Direct path returning false"); 
     return false; 
    } 
} 

J'ai mis la layerMask pour tous les collisionneurs de mur dans le jeu de « mur » qui est le numéro 8 dans ma liste de couche. Mais la fonction renvoie false à chaque fois, ce qui signifie qu'un collisionneur mural est frappé à chaque fois. Le point de départ ne se trouve même pas à l'intérieur d'un collisionneur, il ne peut donc pas être atteint par son propre collisionneur. Mais je veux utiliser cette même fonction pour déterminer la ligne de vue du joueur, ce qui impliquera un collisionneur.

+0

@AlfieGoodacre Il est 0 base, mais j'ai essayé 7 et est toujours fausse retournais chaque fois. J'ai essayé de voir ce que le hitwall.collider.gameObject.name est mais il ne retourne rien. Est-ce la bonne façon de vérifier ce qu'il frappe réellement? –

Répondre

4

Votre problème est sur cette ligne:

RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8); 

Il devrait être comme suit:

RaycastHit2D hitWall = Physics2D.Linecast (start, end, (1<<8)); 

Pourquoi? Parce que cet argument veut une couche masque, soit un masque de bits pour la couche, pas un index.

Cet argument ne veut pas une seule couche, il donne l'option de lancer contre plusieurs couches comme défini par l'ordre des bits dans le masque (tous les bits seront 0 excepté celui que vous avez fait 1). Cela vous permet de combiner des masques, et de faire des choses comme ~(1<<8) qui jette contre toutes les couches sauf 8.

documentation pertinente: https://docs.unity3d.com/Manual/Layers.html

Edit:

Un autre problème est que RaycastHit2D est un type struct . Cela signifie que ce ne sera toujours pas nul.

Vous voulez vérifier if (hitWall.collider == null) {

Voir: http://answers.unity3d.com/questions/691622/why-does-raycast2d-always-return-non-null.html

+0

Merci, mais je me trompe toujours à chaque fois. –

+0

Juste pour être sûr: Vérifiez que vous ne vous frappez pas, vérifiez vos points de début et de fin, vérifiez la configuration des colliers (et assurez-vous que vous avez correctement calculé l'index). Enfin, si vous frappez quelque chose, voyez ce que vous frappez (essayez d'imprimer son 'gameobject.name') – code11

+0

Quand je fais Debug.Log (" Direct path return false "+ hitWall.collider.gameObject.name) rien imprime dans la console ... –