Una colisión ocurre cuando dos objetos 3D entran en contacto dentro del mundo 3D. Para un manejo de colisión personalizado, BasePart tiene un conjunto de eventos de colisión y filtros de colisión, para que pueda controlar qué montajes físicos se colisionan con otros.
Eventos de colisión
Los eventos de colisión occurren cuando dos BaseParts tocan o dejan de tocar en el mundo 3D. Puedes detectar estos eventos a través de los eventos Touched y 2>Class.BasePart
- La propiedad CanCollide de una parte afecta si chocará físicamente con otras partes y causará que las fuerzas actúen sobre ellas. Incluso si CanCollide está des
- Los eventos Touched y TouchEnded solo se activan como resultado de un movimiento físico, no de un cambio de Class.BasePart.Position|Position o 1>Class.BasePart.CFrame|CFrame1> que provoca que una parte se interese o de
- La clase de nivel superior Terrain hereda de BasePart , por lo que puedes asignar un grupo de colisión a 1> Class.Terrain para determinar si otros 4> Class.BasePart|BaseParts4> colisionan con 7>Terrain7> vértices.
Tocado
El evento Touched activa cuando un BasePart viene en contacto con otro, o con un Vóxelde terreno. Solo se activa como resultado de la simulación física y no se activará cuando el parte
El siguiente patrón de código muestra cómo el evento Touched se puede conectar a una función personalizada onTouched() . Nota que el evento envía el argumento otherPart a la función, indicando la otra parte implicada en la colisión.
Colisión de partes
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 múltiples veces en rápida sucesión según colisiones sutiles, como cuando un objeto en movimiento "se asienta" en una posición de descanso o cuando una colisión implica un modelo de múlt
Colisión de partes con tiempo de reutilización
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 a verdadero
task.wait(COOLDOWN_TIME) -- Espere la duración de la cooldown
part:SetAttribute("Touched", false) -- Restablecer atributo
end
end
part.Touched:Connect(onTouched)
ToqueTerminado
El evento TouchEnded activa cuando el límite de colisión entera de un BasePart salga del límite de otro Class.
El siguiente patrón de código muestra cómo el evento TouchEnded se puede conectar a una función personalizada onTouchEnded() . Como el evento Class.BasePart.Touched|Touched ', el evento envía el argumento 1> otherPart 1> a la función, indicando la otra parte involucrada.
Detecta No-Colisión
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 filtra define qué partes físicas se colisionan con otras. Puedes configurar la filtración para muchos objetos a través de grupos de colisión o puedes controlar las colisiones en una base parte a parte con 1>instancias Class.NoCollisionConstraint1>.
Grupos de colisión
Colisión grupos le permite asignar BaseParts a grupos dedicados y especificar si o no están de acuerdo con los que están en otros grupos. Las partes dentro de grupos no colisionan completamente, incluso si ambas partes tienen su propiedad de CanCollide definida como 1> true1> .
Puede crear fácilmente grupos de colisión a través de Studio's Editor de grupos de colisión , accesible haciendo clic en el botón grupos de colisión en la pestaña Modelo.
El editor funciona en either Lista de vista which favors fijar a la izquierda o derecha de Studio, or in a wider vista de tabla which favors fijar a la parte superior o inferior.
Registro de 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 colisiones:
Haga clic en el botón Añadir grupo junto a la parte superior del panel del editor, ingrese un nuevo nombre de grupo, y presione Entrar . El nuevo grupo aparece en ambas columnas de la vista de lista, o en ambas columnas de la 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 renombrar .
Configurando colisiones de grupos
Por defecto, los objetos en todos los grupos se chocan entre sí. Para evitar que los objetos en un grupo se choquen con los objetos en otro grupo, Deselecciona la casilla en la fila/columna respectiva.
En el siguiente ejemplo, los objetos en el grupo Cubos no se chocarán con los objetos en el grupo Puertas .
Asignar objetos a grupos
Para asignar objetos a grupos que has registrado a través del editor del Studio:
Seleccione uno o más BaseParts que califiquen como parte de un grupo de colisión.
Asigna asignarlos al grupo haciendo clic en el botón ⊕ para su fila. Los objetos solo se 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 debajo de la propiedad CollisionGroup del objeto.
Grupo de colisión StudioSelectable
Las herramientas en Studio usan el sistema de filtrado de colisión para determinar qué objetos son candidatos para la selección al hacer clic en la ventana de vista 3D. Los objetos cuyo grupo de colisión asignado no hace no colisionar con StudioSelectable se ignorarán.
Por ejemplo, si tienes puntos de control en una experiencia de carreras cuyas áreas efectivas están definidas por grandes partes transparentes, puedes asignarlos a un grupo de colisión de puntos de control y luego hacer que ese grupo no se interfiera con StudioSelectable para que no se interfieran cuando estés editando la geometría subyacente.
Para el código de los plugins, se recomienda que asignes "StudioSelectable" como filtro de grupo de colisión de tu RaycastParams al encontrar partes debajo del cursor. Esto permite que tus plugins coinciden con las mecánicas de selección que los creadores han aprendido a esperar de las herramientas de Studio integradas.
Recomendado selección de plugin Raycast
local UserInputService = game:GetService("UserInputService")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Para seguir la convenciónraycastParams.BruteForceAllSlow = true -- Para que las partes con CanQuery de "falso" 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 parcial a parcial
Para evitar las 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ónSin colisión. Las ventajas incluyen:
- No se requieren grupos de colisión y/o scripts de configuración, por lo que puede crear y compartir fácilmente modelos con filtros de colisión personalizados.
- Las partes conectadas no se chocarán entre sí, pero aún pueden chocarse con otros objetos.
Desactivando colisiones de personajes
Los personajes de los jugadores de Roblox se chocan entre sí por defecto. Esto puede llevar a un juego interesante pero no intencional, como personajes saltando uno encima del otro para alcanzar áreas específicas. Si este comportamiento no deseado, puede evitarlo a través de la siguiente Script en ServerScriptService .
Script - Desactivar colisiones de personajes
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Establecer un grupo de colisión para cualquier parte descendiente
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Procesar descendientes existentes y nuevos para la configuración de la física
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Detecta cuando se agrega el personaje del jugador
player.CharacterAdded:Connect(onCharacterAdded)
end)
Colisiones de modelos
Model objetos son contenedores para partes en lugar de heredar de BasePart , por lo que no pueden conectarse directamente a BasePart.Touched o
El siguiente código de ejemplo conecta todos los BaseParts de un modelo de múltiples partes a los 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 las instancias de modelos que se interponen con él
if otherPart:IsDescendantOf(model) then return end
-- Aumentar el número de partes de modelo que tocan
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignorar las instancias del modelo que no se intersección con él
if otherPart:IsDescendantOf(model) then return end
-- Reducir la cantidad de partes de modelo que 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 malla y sólido
MeshPart y PartOperation (las partes unidas por modelado sólido ) son subclases de 0> Class.BasePart
La propiedad CollisionFidelity tiene las siguientes opciones, en orden de fidelidad y rendimiento del impacto desde el menor al mayor:
- Caja — Crear una caja delimitadorade colisión de contorno, ideal para objetos pequeños o no interactivos.
- Cascaron — Genera un cascaron convexo, adecuado para objetos con menos pronunciadas ranuras o cavidades.
- Por defecto — Produce una forma de colisión aproximada que soporta la concavidad, adecuada para objetos complejos con necesidades de interacción semi-detalladas.
- PreciseConvexDecomposition — Ofrece la mayor fidelidad pero aún no es una representación 1:1 del visual. Esta opción tiene el costo de rendimiento más caro y toma más tiempo para que el motor lo calcular.
Para obtener más información sobre el impacto de rendimiento de las opciones de fidelidad de colisión y cómo mitigarlas, see optimización del rendimiento . Para un tutorial en profundidad sobre cómo elegir una opción de fidelidad de colisión que equilibra sus necesidades de precisión y requisitos de rendimiento, see aquí .