Unity bounds

Qu’est qu’une bbox ? Unity bounds

Sur la plateforme Unity, la structure Bounds est la représentation C# d’une bounding box.

Cette dernière, fréquemment utilisée en cartographie, se caractérise par une zone délimitée par un centre et une taille.
Dans l’écosystème Unity, elle trouve notamment son application pour représenter les volumes d’un collider.

Sommaire

Qu’est-ce qu’un Bounds ?

Bounds, ou « An axis-aligned bounding box » (AABB), est une boîte alignée sur les axes, également connue sous l’acronyme bbox dans le domaine cartographique.

Sur Unity, cette structure est définie par un centre et une taille, elle ne possède pas de rotation.

Unity bounds displaySphère avec bounding box en rouge

Les Renderers, Colliders, et Mesh utilisent Bounds pour représenter leur volume.

Note: Avec un collider, on ne peut pas modifier le volume directement par la propriété bounds.
Il faudra utiliser les propriété spécifiques au Collider size ect …

Pourquoi l’utiliser ?

Le Bounds, en tant que boîte, permet de réaliser différents calculs avec de meilleures performances qu’un collider.

Le boost de performance dépend du type de collider utilisé, car par exemple sur Unity l’utilisation d’un box collider reste plus performant qu’un polygon collider.
Il faut tout de même noter que le collider reste plus précis, Bounds est plus grossier dans ces calculs.

Le choix entre une fonction coûteuse mais précise et une fonction rapide mais moins précise dépend du type de jeu que vous créez et de vos besoins.

De plus, Bounds est simple d’utilisation, offrant un ensemble de fonctions prêtes à l’emploi pour les collisions et raycast ainsi qu’une facilité de redimensionnement.

Comment l’utiliser ?

Pour les composants Renderer, Collider et Mesh, le Bounds est créé automatiquement selon les valeurs du composant.

Il est récupérable en utilisant la propriété bounds : var bounds = mesh.bounds;

Le bounds peut aussi être créé via un constructeur en lui passant un centre et une taille comme arguments : var bounds = new Bounds(Vector3.zero, Vector3.one);

On peut modifier son volume avec les propriétés suivantes :

  • size: la taille de la bbox.
  • center: le centre du bbox.
  • min: les points minimaux de la bbox.
  • max: les points maximaux de la bbox.
  • extents: la taille divisée par 2.

Chacune de ces propriétés est un Vector3.

On peut aussi utiliser les méthodes SetMinMax, Encapsulate et Expand pour ces modifications.

Les modifications apportées sur un bounds attaché à un composant ne modifieront pas le rendu à l’écran.
Bounds n’est qu’une visualisation graphique, mais il est utilisé, par exemple, pour le culling.

Méthodes spécifiques aux collisions

Maintenant place à la partie la plus intéressante, Bounds possède des méthodes spécifiques aux collisions.

Nous évitant de replonger dans nos cours de math …

Pour présenter les méthodes on va partir d’une zone récupéré sur un collider :

using UnityEngine;

public class BoundsBehaviour : MonoBehaviour
{
	private Collider _collider;

	private void Awake()
	{
	    _collider = GetComponent<Collider>();
	}
}

ClosestPoint

On définit un point sur la scène, et la méthode ClosestPoint nous renvoie quel point de notre zone est le plus proche.

var closestPoint = _collider.bounds.ClosestPoint(positionEnemy);

Unity ClosestPointEn bleu le point passé en paramètre, en jaune le point le plus proche.

Contains

Nous permet de savoir si le point passé en argument est à l’intérieur ou non de la zone, Contains retourne true le cas échéant.

if (_collider.bounds.Contains(positionPlayer)) {
  // if player in the zone, do something
}

IntersectRay

Permet de connaître si un ray traverse notre zone, IntersectRay retourne true le cas échéant.

// create ray, like a gun fire
var ray = new Ray(playerPosition, playerDirection);

// Check if ray hits our bbox
if (_collider.bounds.IntersectRay(ray, out float distance)) {
  // Player has hit his target
}

Unity IntersectRayEn bleu le ray transperçant la bbox

Intersects

Permet de savoir si une autre bounds est en contact avec la bounds appelant la fonction, Intersects retourne true si oui.

// bounds are in collision
if (_collider.bounds.Intersects(otherBounds)) {

}

SqrDistance

Retourne la plus petite distance au carré entre le bounds et un point.
SqrDistance retourne un float.

// Calculate the min distance between bbox and player
var minDistance = _collider.bounds.SqrDistance(playerPosition);

FAQ

Quelle est la différence entre Bounds et Rect dans Unity ?

La différence entre Bounds et Rect est que Bounds fonctionne dans un monde 3D, alors que Rect ne fonctionne que en 2D.
De plus, Bounds possède un plus grand nombre de méthodes : possibilité de calculer le point le plus proche, intersection de rayon, etc.

Merci d’avoir lu cet article.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *