La physique derrière le Raycasting dans Unity

Le Raycasting dans Unity permet la détection des intersections entre un rayon et les objets du jeu dans la scène. Il s'agit d'une technique vitale, fréquemment utilisée pour la ligne de vue des personnages, les mécanismes de tir ou la détection d'objets. Le moteur Unity propose un raycasting 2D et 3D via son système physique. Ce didacticiel couvre les aspects fondamentaux du raycasting dans les deux dimensions, avec des exemples de code concis pour illustrer les concepts.

1. Bases du Raycasting

  • Un rayon dans le contexte de Unity est défini par un point de départ et une direction. Lorsque ce rayon est lancé, il « se déplace » dans sa direction, détectant tous les objets qu'il croise.

2D Raycasting:

Vector2 rayOrigin = new Vector2(1, 1);
Vector2 rayDirection = new Vector2(1, 0);
float rayLength = 10f;

RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength);

if (hitInfo.collider != null)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

3D Raycasting:

Vector3 rayOrigin = new Vector3(1, 1, 1);
Vector3 rayDirection = new Vector3(1, 0, 0);
float rayLength = 10f;

RaycastHit hitInfo;
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength);

if (hasHit)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

2. Plonger plus profondément: la structure de 'RaycastHit'

  • Lorsque le raycasting détecte un objet, il renvoie des informations dans une structure. Pour la 2D, c'est 'RaycastHit2D', et pour la 3D, c'est 'RaycastHit'.

Les propriétés communes incluent:

  • 'collider': Le collisionneur que le rayon a frappé.
  • 'point': Le point du monde où le rayon a touché la surface du collisionneur.
  • 'distance': La distance entre l'origine du rayon et le point d'impact.

3. Masques de calque: filtrage des résultats Raycast

  • Il devient souvent nécessaire de limiter les objets qu'un rayon peut atteindre. Unity propose des masques de calque à cet effet.

2D Mise en œuvre:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, layerMask);

3D Mise en œuvre:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength, layerMask);

Questions à aborder:

  1. Quelle est la différence entre le raycasting 2D et 3D dans Unity ?: bien que le concept de base reste le même, le raycasting 2D renvoie un 'RaycastHit2D' et utilise la classe 'Physics2D', tandis que le raycasting 3D renvoie un 'RaycastHit' et utilise la classe 'Physics'.
  2. Pourquoi utiliser des masques de calque avec le raycasting ?: Les masques de calque permettent de filtrer les résultats du raycast. Cela garantit que le rayon interagit uniquement avec des couches spécifiques, offrant ainsi un contrôle précis sur ce que le rayon peut détecter.
  3. Comment déterminer dynamiquement le point de départ d'un rayon ?: Souvent, l'origine du rayon s'aligne avec la caméra ou la position d'un personnage. Cette affectation dynamique est réalisable en utilisant 'Camera.main.transform.position' pour la position de la caméra ou 'gameObject.transform.position' pour la position d'un objet de jeu.

Conclusion

En comprenant le raycasting dans Unity, des mécanismes de jeu tels que la détection d'objets, le tir et la ligne de mire peuvent être mis en œuvre efficacement. N'oubliez pas d'utiliser judicieusement les masques de calque pour affiner les interactions des rayons et de toujours être conscient du contexte dimensionnel (2D ou 3D) lorsque vous travaillez dans le Unity moteur.