Uma colisão ocorre quando dois objetos 3D entram em contato dentro do mundo 3D. Para um controle de colisão personalizado, BasePart tem um conjunto de eventos de colisão e filtros de colisão, para que você possa controlar quais agrupamentos físicos colidem com outros.
Eventos de Colisão
Os eventos de colisão Class.BasePart|BaseParts ocorrem quando duas Class.BasePart.Touched|Touched's tocam ou param de tocar no mundo 3D. Você pode detectar esses eventos através dos eventos Class.BasePart.Touched|Tou
- A propriedade CanCollide de uma peça afeta se ela physicalmente colidir com outras peças e causar forças a agir sobre elas. Mesmo que CanCollide seja desativado para uma
- Os eventos Touched e TouchEnded só são disparados como resultado de um movimento físico, não de uma Class.BasePart.Position|Position ou 1>Class.BasePart.CFrame|CFrame1> alteração que causa uma parte para interceptar ou parar
- A classe de nível superior Terrain herda de BasePart , para que você possa atribuir um grupo de colisão a 1> Class.Terrain para determinar se outros 4> Class.BasePart|BaseParts4> colidem com voxels de 7>Terrain7>.
Toque
O evento Touched ocorre quando um BasePart vem em contato com outro, ou com um voxel de Terreno. Ele só ocorre como resultado de 2>simulação fís
O seguinte padrão de código mostra como o evento Touched pode ser conectado a uma função personalizada onTouched(). Observe que o evento envia o argumento otherPart para a função, indicando a outra parte envolvida na colisão.
Colisão de Peças
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Nota que o evento Touched pode disparar várias vezes em sucessão rápida com base em colisões sutis, como quando um objeto em movimento "settles" em uma posição de descanso ou quando uma colisão envolve um modelo de múltiplas pe
Colisão de Peças com Tempo de Espera
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) -- Definir o atributo para verdadeiro
task.wait(COOLDOWN_TIME) -- Aguarde pela duração do cooldown
part:SetAttribute("Touched", false) -- Redefinir atributo
end
end
part.Touched:Connect(onTouched)
ToqueTerminado
O evento TouchEnded ativa quando todo o limite de colisão de uma BasePart sai dos limites de outro Class.
O seguinte padrão de código mostra como o evento TouchEnded pode ser conectado a uma função personalizada onTouchEnded(). Como Class.BasePart.Touched|Touched , o evento envia o argumento 1> otherPart 1> para a função, indicando a outra parte envolvida.
Detecção de Colisão Não
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Filtro de Colisão
Colisão 필터링 define quais peças físicas colidem com outras. Você pode configurar o filtramento para vários objetos através de grupos de colisão ou você pode controlar as colisões em uma base de parte-a-parte com 1>instâncias de4>Class.NoCollisionConstraint4>.
Grupos de Colisão
Colisão grupos deixe você atribuir BaseParts a grupos dedicados e especificar se eles colidem ou não com aqueles em outros grupos. Peças dentro de grupos não colisivos passam umas com as outras completamente, mesmo que ambas as peças tenham sua propriedade CanCollide definida como <
Você pode facilmente configurar grupos de colisão através do Editor de Grupos de Colisão do Studio, acessível clicando no botão Grupos de Colisão na aba Modelo.
As funções do editor são em <a href="https://developer.microsoft.com/pt-br/microsoft-edge/microsoft-edge-desktop-view/"> Lista de Visualização </a>, que favorece <kbd> docking</kbd> para o lado esquerdo ou direito do Studio, ou em uma visão de tabela mais ampla, que favorece o docking para a parte superior ou inferior.
Registrando Grupos
O editor inclui um Grupo de Colisão Padrão que não pode ser renomeado ou excluído. Todos os BaseParts são automaticamente pertencentes a este grupo padrão, a menos que sejam atribuídos a outro grupo, o que significa que eles colidirão com todos os outros objetos no grupo Padrão .
Para criar um novo grupo de colisão:
Clique no botão Adicionar Grupo na parte superior do painel do editor, insira um novo nome de grupo e pressione Enter. O novo grupo aparece em ambas as colunas da verde lista ou na coluna esquerda e superior da verde tabela.
Repita o processo se necessário, escolhendo um nome único e descritivo para cada grupo. Observe que você pode alterar o nome de um grupo durante o desenvolvimento clicando em seu campo, ou selecionando-o e clicando no botão renomear .
Configurando Colisões de Grupo
Na configuração padrão, objetos em todos os grupos colidem uns com os outros. Para evitar que objetos em um grupo colidam com objetos em outro grupo, desmarque a caixa na linha/coluna respectiva.
No seguinte exemplo, objetos no grupo Cubos não irão colidir com objetos no grupo Portas .
Atribuindo Objetos a Grupos
Para atribuir objetos a grupos que você registrou através do editor do Studio:
Selecione um ou mais BaseParts que se qualifiquem como parte de um grupo de colisão.
Atribua-os ao grupo clicando no botão ⊕ para sua linha. Os objetos podem pertencer a apenas um grupo de colisão por vez, então colocá-los em um novo grupo os remove do seu grupo atual.
Uma vez atribuído, o novo grupo é refletido sob a propriedade CollisionGroup do Objeto.
Grupo de Colisão StudioSelectable
As ferramentas no Studio usam o sistema de filtragem de colisão para determinar quais objetos são candidatos à seleção quando você clica na janela de visualização 3D. Os objetos cujo grupo de colisão atribuído não estiver não colidir com StudioSelectable serão ignorados.
Por exemplo, se você tiver checkpoints em uma experiência de corrida cujas áreas efetivas são definidas por grandes peças transparentes, você pode atribuí-los a um Checkpoints grupo de colisão e, em seguida, torná-los não colidíveis com StudioSelectable para que eles não bloqueiem quando você estiver editando a geometria subjacente do mapa.
Para código de plugin, recomenda-se que você atribua "StudioSelectable" como filtro de grupo de colisão de seu RaycastParams ao encontrar peças sob o cursor. Isso permite que seus plugins correspondam às mecânicas de seleção que os criadores aprenderam a esperar das ferramentas de estúdio incorporadas.
Recomendação de seleção de plugin Raycast
local UserInputService = game:GetService("UserInputService")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Para seguir a convençãoraycastParams.BruteForceAllSlow = true -- Para que peças com CanQuery de "false" possam ser selecionadaslocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Filtrando Peça a Peça
Para evitar colisões entre duas peças específicas sem configurar grupos de colisão, como entre a roda de um veículo e sua estrutura, considere o Sem Colisão restrição. Vantagens incluem:
- Grupos de colisão e/ou scripts de configuração não são necessários, para que você possa facilmente criar e compartilhar modelos com filtros de colisão personalizados.
- Partes conectadas não colidirão uns com os outros, mas elas ainda podem colidir com outros objetos.
Desabilitando Colisões de Personagens
Os personagens do jogador do Roblox colidem uns com os outros por padrão. Isso pode levar a jogabilidadeinteressantes, mas não intencionais, como personagens pulando entre si para alcançar áreas específicas. Se esse comportamento for indesejado, você pode impedi-lo seguindo o seguinte Script em ServerScriptService.
Script - Desabilitar Colisões de Personagens
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Definir grupo de colisão para qualquer peça Descendente
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Processar descendentes existentes e novos para configuração de física
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Detectar quando o personagem do jogador é adicionado
player.CharacterAdded:Connect(onCharacterAdded)
end)
Colisões de Modelos
Model objetos são contêineres para peças, não herdando de BasePart , para que eles não possam se conectar diretamente aos eventos Class.BasePart.Tou
O seguinte código de exemplo conecta todos os BaseParts de um modelo de múltiplas peças a eventos de colisão e rastreia o número total de colisões com outras peças.
Colisão de Modelos
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignorar instâncias do modelo intersecando com si mesmo
if otherPart:IsDescendantOf(model) then return end
-- Aumentar o número de peças do modelo tocando
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignorar instâncias do modelo não se intersecando com ele
if otherPart:IsDescendantOf(model) then return end
-- Diminuir o número de peças do modelo tocando
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
Colisões de modelo sólido e malha
MeshPart e PartOperation (peças juntadas por modelagem sólida), são subclasse de 0> Class.
A propriedade CollisionFidelity tem as seguintes opções, na ordem de fidelidade e impacto de desempenho mais baixo para mais alto:
- Caixa — Cria uma caixa de colisão de limites, ideal para pequenos ou não interativos objetos.
- Casca — Gera uma casca côncava, adequada para objetos com menos espaços índezes ou cavidades.
- Padrão — Produz uma forma de colisão aproxima que suporta a recessão, adequado para objetos complexos com necessidades de interação semi-detalhadas.
- PreciseConvexDecomposition — Oferece a maior precisão, mas ainda não é uma representação 1:1 do visual. Essa opção tem o maior custo de desempenho e leva mais tempo para o motor calcular.
Para mais informações sobre o impacto de desempenho das opções de fidelidade de colisão e como mitigá-las, see Performance Optimization . Para um passeio completo sobre como escolher uma opção de fidelidade de colisão que equilibrar suas necessidades de precisão e requisitos de desempenho, see aqui .