Colisiones

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

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 CanTouch de una parte determina si se activan eventos de colisión. Si se establece en false, ninguna Touched o 1> Class.BasePart.TouchEnded|TouchEnded1> desencadenar.
  • 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> .

En el video de arriba, los objetos giratorios están en diferentes grupos de colisión para que colisionen con objetos de otro color, pero no con objetos de su propio color

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.

Collision Groups tool indicated in Model tab of Studio

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.

List View example in Collision Groups Editor

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:

  1. 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.

    New group added to Collision Groups Editor in List View
  2. 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 .

    Button and field indicated for renaming a group in the Collision Groups Editor

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 .

Group configured in List View of Collision Groups Editor

Asignar objetos a grupos

Para asignar objetos a grupos que has registrado a través del editor del Studio:

  1. Seleccione uno o más BaseParts que califiquen como parte de un grupo de colisión.

  2. 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.

    Plus button indicated in Collision Groups Editor for adding selected parts to a group

Una vez asignado, el nuevo grupo se refleja debajo de la propiedad CollisionGroup del objeto.

Chosen collision group indicated as the part's CollisionGroup property

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.

Checkpoints group configured to be non-collidable with StudioSelectable group

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ón
raycastParams.BruteForceAllSlow = true -- Para que las partes con CanQuery de "falso" se puedan seleccionar
local 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.
Original mesh of castle tower

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í .