Ocurre una colisión cuando dos objetos 3D entren en contacto dentro del mundo 3D.Para un manejo de colisiones personalizado, BasePart tiene un conjunto de eventos de colisión y técnicas de filtrado de colisión, por lo que puedes controlar qué ensamblajes físicos chocan con otros.
Eventos de colisión
Los eventos de colisión ocurren cuando dos se tocan o dejan de tocarse en el mundo 3D.Puedes detectar estas colisiones a través de los eventos Touched y TouchEnded que ocurren independientemente del valor de propiedad de cualquier parte de CanCollide.Al considerar la gestión de colisiones en las piezas, tenga en cuenta lo siguiendo:
- La propiedad de una parte determina si desencadena eventos de colisión. Si se establece en , ninguna de ni desencadenar.
- La propiedad de una parte CanCollide afecta si colisionará físicamente con otras partes y causará que las fuerzas actúen sobre ellas.Incluso si CanCollide está deshabilitado para una parte, puedes detectar toques y no toques a través de Touched y TouchEnded eventos.
- Los eventos Touched y TouchEnded solo se disparan como resultado de movimiento físico , no de cambios Position o CFrame que causen que una parte se intersecte o deje de interactuar con otra parte.
- La clase de nivel superior hereda de , por lo que puedes asignar un grupo de colisión a para determinar si otros colisionan con Terrain voxeles.
Tocado
El evento Touched se activa cuando un BasePart entra en contacto con otro, o con un Vóxelde terreno.Solo se dispara como resultado de simulación física y no disparará cuando la parte Position o CFrame esté explícitamente configurada de tal manera que se intersecte con otra parte o Vóxel.
El siguiente patrón de código muestra cómo se puede conectar el evento Touched a una función personalizada onTouched().Tenga en cuenta que el evento envía el argumento otherPart a la función, indicando la otra parte involucrada en la colisión.
Colisión de parte
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Tenga en cuenta que el evento Touched puede disparar varias veces en rápida sucesión en función de sutiles colisiones físicas, como cuando un objeto en movimiento "se asienta" en una posición de reposo o cuando una colisión involucre un modelo de múltiples partes.Para evitar activar más eventos Touched que lo necesario, puedes implementar un sencillo sistema de debounce que impone un período de "enfriamiento" a través de un atributo de instancia.
Colisión de parte con tiempo de reutilización
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " collided with " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Establecer atributo en verdadero
task.wait(COOLDOWN_TIME) -- Espere la duración de espera
part:SetAttribute("Touched", false) -- Atributo de reinicio
end
end
part.Touched:Connect(onTouched)
Terminado al tacto
El evento se activa cuando toda la frontera de colisión de un sale de los límites de otro o un Vóxelde terreno lleno.Solo se dispara como resultado de simulación física y no disparará cuando la parte Position o CFrame esté explícitamente configurada para que deje de interactuar con otra parte o Vóxel.
El siguiente patrón de código muestra cómo se puede conectar el evento TouchEnded a una función personalizada onTouchEnded().Como Touched , el evento envía el argumento otherPart a la función, indicando la otra parte involucrada.
Detectar no colisiones
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Filtro de colisión
La colisión filtración define qué partes físicas chocan con otras.Puedes configurar la filtración para numerosos objetos a través de grupos de colisión o puedes controlar las colisiones en una base de parte a parte con instancias.
Grupos de colisión
La colisión grupos te permite asignar BaseParts a grupos dedicados y especificar si chocan o no con los de otros grupos.Las piezas dentro de grupos no colisionantes pasan una por otra completamente, incluso si ambas piezas tienen su propiedad CanCollide establecida en true.
Puedes configurar fácilmente grupos de colisión a través del editor de grupos de colisión de Studio, accesible haciendo clic en el botón grupos de colisión en la pestaña modelo de la barra de herramientas.

El editor funciona en cualquiera de vista en lista que favorece acoplarse al lado izquierdo o derecho de Studio, o en una vista más amplia tabla que favorece el acoplamiento a la parte superior o inferior.

Registrar grupos
El editor incluye un grupo de colisión predeterminado que no se puede renombrar o eliminar .Todos los BaseParts pertenecen automáticamente a este grupo predeterminado a menos que se asigne a otro grupo, lo que significa que colisionarán con todos los demás objetos en el grupo predeterminado .
Para crear un nuevo grupo de colisión:
Haga clic en el botón Añadir grupo en la parte superior del panel del editor, introduzca un nuevo nombre de grupo y presione Enter.El nuevo grupo aparece en ambas columnas de vista en lista o en ambas columnas de la columna izquierda y fila superior de vista de tabla.
Repita el proceso si es necesario, eligiendo un nombre único y descriptivo para cada grupo.Tenga en cuenta que puede cambiar el nombre de un grupo durante el desarrollo haciendo clic en su campo o seleccionándolo y haciendo clic en el botón cambiar nombre .
Configurar colisiones de grupo
Bajo la configuración predeterminada, los objetos de todos los grupos chocan entre sí.Para evitar que los objetos de un grupo colisionen con objetos de otro grupo, desmarca la casilla en la respectiva fila/columna.
En el siguiente ejemplo, los objetos del grupo Cubos no chocarán con los objetos del grupo Puertas .

Asignar objetos a grupos
Para asignar objetos a grupos que has registrado a través del editor de Studio:
Seleccione uno o más BaseParts que califiquen como parte de un grupo de colisión.
Asignárselos al grupo haciendo clic en el botón ⊕ para su fila.Los objetos solo pueden pertenecer a un grupo de colisión a la vez, por lo que colocarlos en un nuevo grupo los elimina de su grupo actual.
Una vez asignado, el nuevo grupo se refleja bajo la propiedad CollisionGroup del objeto.

grupode colisión seleccionable de estudio
Las herramientas en Studio usan el sistema de filtrado de colisiones para determinar qué objetos son candidatos para la selección al hacer clic en la ventanilla3D.Los objetos cuyo grupo de colisión asignado no colisiona con Seleccionable de Studio serán ignorados.
Por ejemplo, si tienes puntos de control en una experiencia de carrera cuyas áreas efectivas se definen por grandes piezas transparentes, puedes asignarlos a un grupo de colisión de puntos de control y luego hacer que ese grupo sea no colisionable con StudioSelectable para que no se interpongan cuando estés editando la geometría del mapa subyacente.

Para el código de plugin, se recomienda que asigne "StudioSelectable" como filtro de grupo de colisión de su RaycastParams cuando encuentre partes bajo el cursor.Esto permite que tus plugins coincidan con las mecánicas de selección que los creadores han aprendido a esperar de las herramientas integradas de Studio.
Raycast de selección de plugins recomendado
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Para seguir la convenciónraycastParams.BruteForceAllSlow = true -- Para que las partes con CanQuery de "false" se puedan seleccionarlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Filtrado de parte a parte
Para evitar colisiones entre dos partes específicas sin configurar grupos de colisión, como entre la rueda de un vehículo y su chasis, considere la restricción Sin colisión.Las ventajas incluyen:
- No se requieren grupos de colisión y/o scripts de configuración, por lo que puedes crear y compartir modelos fácilmente con filtrado de colisión personalizado.
- Las piezas conectadas no chocarán entre sí, pero aún pueden chocar con otros objetos.
Desactivar colisiones de caracteres
Los personajes de jugadores de Roblox chocan entre sí por defecto.Esto puede conducir a un juego interesante pero no previsto, como personajes que saltan uno sobre el otro para llegar a áreas específicas.Si este comportamiento es indeseable, puedes evitarlo a través del siguiente Script en ServerScriptService .
Script - Desactivar colisiones de caracteres
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
local CollisionGroupName = "Characters"
PhysicsService:RegisterCollisionGroup(CollisionGroupName)
PhysicsService:CollisionGroupSetCollidable(CollisionGroupName, CollisionGroupName, false)
local function setCollisionGroup(model)
-- Aplicar grupo de colisión a todas las piezas existentes en el aplicación de modelado
for _, descendant in model:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.CollisionGroup = CollisionGroupName
end
end
end
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
setCollisionGroup(character)
end)
-- Si el jugador ya tiene un personaje, aplique el grupo de colisión inmediatamente
if player.Character then
setCollisionGroup(player.Character)
end
end)
Colisiones de modelos
Model objetos son contenedores para piezas en lugar de heredar de BasePart, por lo que no pueden conectarse directamente a BasePart.Touched o BasePart.TouchEnded eventos.Para determinar si un modelo activa eventos de colisión, necesitas recorrer sus hijos y conectar las funciones personalizadas onTouched() y onTouchEnded() a cada hijo BasePart .
El siguiente ejemplo de código conecta todos los BaseParts de un modelo de múltiples partes a eventos de colisión y rastrea el número total de colisiones con otras partes.
Colisión de modelos
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignorar instancias del modelo que se intersectan con sí mismas
if otherPart:IsDescendantOf(model) then return end
-- Aumentar el número de partes del modelo que se tocan
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignorar instancias del modelo que no se intersectan con sí mismas
if otherPart:IsDescendantOf(model) then return end
-- Reducir el número de partes del modelo que se tocan
numTouchingParts -= 1
print(model.Name, "un-intersected from", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
Colisiones de modelos de malla y sólido
MeshPart y PartOperation (piezas unidas por modelado sólido ) son subclases de BasePart , por lo que las mallas y las piezas modeladas sólidas heredan las mismas opciones de eventos de colisión y filtrado de colisión que las piezas regulares.Sin embargo, dado que las mallas y las piezas modeladas sólidas suelen tener geometrías más complejas, tienen una propiedad distintiva CollisionFidelity que determina con qué precisión se alinean los límites físicos con la representación visual para el manejo de colisiones.
La propiedad CollisionFidelity tiene las siguientes opciones, en orden de fidelidad y de impacto de rendimiento desde la más baja a la más alta:
- Caja — Crea una caja delimitadorade colisión de contención, ideal para objetos pequeños o no interactivos.
- Casco — Genera un casco convexo, adecuado para objetos con menos depresiones o cavidades pronunciadas.
- Por defecto — Produce una forma de colisión aproximada que soporta la concavidad, adecuada para objetos complejos con necesidades de interacción semi-detalladas.
- Descomposición convexa precisa — Ofrece la mayor precisión de fidelidad, pero aún no es una representación 1:1 del visual.Esta opción tiene el costo de rendimiento más alto y tarda más en calcularse para el motor.

Para obtener más información sobre el impacto de rendimiento de las opciones de fidelidad de colisión y cómo mitigarlas, consulte optimización de rendimiento.