Volver a la página principal
sábado 15 marzo 2025
3

Para que sirve Physics.OverlapSphereNonAlloc en Unity

En Unity, Physics.OverlapSphereNonAlloc es un método de la API de física que se utiliza para detectar colisiones dentro de una esfera imaginaria en el espacio 3D, pero de manera optimizada para evitar la creación de "garbage" (basura generada por asignaciones de memoria frecuentes). Es especialmente útil en proyectos donde la eficiencia es crítica (como en juegos con muchos objetos o actualizaciones frecuentes).

¿Para qué sirve?

Detecta todos los colliders que están dentro o intersectan con una esfera definida por un centro y un radio, almacenando los resultados en un array predefinido. A diferencia de Physics.OverlapSphere (que crea un nuevo array cada vez), NonAlloc reutiliza un array existente, lo que reduce la carga del recolector de basura (Garbage Collector).

Parámetros principales:

int Physics.OverlapSphereNonAlloc(
    Vector3 center,     // Centro de la esfera en el mundo.
    float radius,       // Radio de la esfera.
    Collider[] results, // Array donde se guardan los colliders detectados.
    int layerMask = AllLayers, // Filtro de capas (opcional).
    QueryTriggerInteraction queryTriggerInteraction = IgnoreTriggers // Comportamiento con triggers (opcional).
);

Valor de retorno:

  • int: Número de colliders encontrados y almacenados en el array results.

⚠️ Si el array es más pequeño que la cantidad de colliders detectados, solo se llenará hasta su capacidad máxima.

Ejemplo de uso básico:

public float radioDeteccion = 5f;
private Collider[] collidersDetectados = new Collider[10]; // Array predefinido.

void Update()
{
    // Detectar colliders en una esfera de radio 5, centrada en la posición del objeto.
    int numColliders = Physics.OverlapSphereNonAlloc(
        transform.position,
        radioDeteccion,
        collidersDetectados
    );

    // Iterar solo hasta el número de colliders detectados.
    for (int i = 0; i < numColliders; i++)
    {
        Debug.Log("Collider detectado: " + collidersDetectados[i].name);
    }
}

Casos de uso comunes:

1. Detección de enemigos cercanos (para IA).

2. Habilidades de área (como explosiones o curaciones).

3. Proximidad para interacciones (recoger objetos, abrir puertas).

4. Optimización de rendimiento en scripts que requieren detección frecuente (como en Update).

Consideraciones clave:

1. Array predefinido:

  • Debes inicializar el array results antes de usarlo (ej: new Collider[20]).
  • Si el array es demasiado pequeño, algunos colliders no se detectarán.
  • Usa un tamaño adecuado para tu caso (ej: 20 si esperas hasta 20 objetos cercanos).

2. Filtrar por capas (layerMask):

  • Usa máscaras de capas para ignorar colliders irrelevantes y mejorar el rendimiento.
int capaEnemigos = LayerMask.GetMask("Enemigos");
   Physics.OverlapSphereNonAlloc(..., capaEnemigos);

3. Triggers:

  • Por defecto, los triggers son ignorados. Si necesitas detectarlos, usa:
Physics.OverlapSphereNonAlloc(..., QueryTriggerInteraction.Collide);

4. Orden de resultados:

  • Los colliders en el array no están ordenados por distancia. Si necesitas ordenarlos, usa cálculos adicionales.

¿Por qué usar NonAlloc en lugar de OverlapSphere?

  • Eficiencia: Evita la creación de nuevos arrays en cada llamada, reduciendo la presión en el Garbage Collector.
  • Rendimiento en tiempo real: Ideal para scripts que se ejecutan en cada frame (como Update).
  • Control: Permite reutilizar buffers de memoria de manera predecible.

Comparación directa:

// Con OverlapSphere (genera garbage):
Collider[] colliders = Physics.OverlapSphere(transform.position, radio);

// Con OverlapSphereNonAlloc (sin garbage):
Collider[] collidersBuffer = new Collider[10];
int num = Physics.OverlapSphereNonAlloc(transform.position, radio, collidersBuffer);

Conclusión:

Usa Physics.OverlapSphereNonAlloc cuando necesites detección de colisiones frecuente y optimizada (ej: enemigos, habilidades de área, sensores). Siempre inicializa el array de resultados previamente y filtra por capas para maximizar el rendimiento.

Etiquetas:
csharp unity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer