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).
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).
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).
);
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.
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);
}
}
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
).
1. Array predefinido:
results
antes de usarlo (ej: new Collider[20]
).
2. Filtrar por capas (layerMask
):
int capaEnemigos = LayerMask.GetMask("Enemigos");
Physics.OverlapSphereNonAlloc(..., capaEnemigos);
3. Triggers:
Physics.OverlapSphereNonAlloc(..., QueryTriggerInteraction.Collide);
4. Orden de resultados:
NonAlloc
en lugar de OverlapSphere
?
Update
).
// 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);
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.
Jorge García
Fullstack developer