Este é um tutorial rápido, simples e fácil de acompanhar sobre como permitir que os jogadores andem através uns dos outros, evitando colisões entre personagens e reduzindo ao máximo a ocorrência de bugs. A ideia é configurar o comportamento dos personagens para que eles não fiquem presos, empurrando uns aos outros ou bloqueando passagens estreitas durante o jogo. Seguindo os passos corretamente, você poderá melhorar a fluidez da movimentação, deixar a experiência mais confortável para todos os jogadores e manter o sistema funcionando de forma estável, com o mínimo possível de problemas inesperados. Para aprender mais sobre criação de games você pode acessar: https://www.metablox.com.br.
Comece indo até a aba Model no Roblox Studio e clique em “Collision Groups”.
Uma vez lá, dependendo da sua versão, você deve ver uma tela como esta.
No topo, clique em “Add Group”.
Digite o nome — recomendo usar **“Player Part”** — e pressione **Enter** para confirmar.
Depois de fazer isso, um novo Collision Group deve aparecer ao lado. Clique nele e você deve ver esta tela.
Certifique-se de desativar a opção “PlayerPart” em “PlayerPart” para que não colida com off.
Agora eu terei 2 tutoriais separados para facilitar o entendimento e ajudar você a seguir o processo correto de acordo com o tipo de personagem que estiver usando. O primeiro tutorial será voltado para quem está usando o personagem padrão, ou seja, aquele personagem que já vem configurado originalmente e não possui alterações personalizadas. Já o segundo tutorial será destinado a quem está usando um personagem personalizado, com aparência, modelo ou configurações diferentes do padrão. Dessa forma, você poderá escolher o tutorial que melhor se encaixa no seu caso e seguir as instruções com mais clareza, evitando confusões durante o processo. Se você estiver usando o personagem padrão, continue acompanhando a primeira parte. Caso esteja usando um personagem personalizado, você poderá pular para a segunda parte quando ela começar. **Personagem Padrão**
Vá até ServerScriptService e crie um novo script.
Nomeie como quiser, eu vou nomeá-lo de PlayerCollide.
Em seguida, precisamos codificá-lo. Para fazer isso, precisamos começar definindo o PlayerService.
local PlayerService = game:GetService("Players") --Definir o Player Service
Depois disso, vamos verificar quando um jogador entra e fazer uma função a partir disso.
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player) --Criar uma variável para o jogador
--Todo: definir a colisão do jogador
end)
Agora vamos obter o personagem do jogador e criar uma variável para ele.
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player)--Criar uma variável para o jogador
local Character = player.Character or player.CharacterAdded:Wait() --Também adicionamos o CharacterAdded:Wait() para garantir que o script obtenha o personagem.
end)
Agora, vamos usar um loop for i para obter todas as partes do personagem que podem colidir, e faremos assim:
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player)--Criar uma variável para o jogador
local Character = player.Character or player.CharacterAdded:Wait() --Também adicionamos o CharacterAdded:Wait() para garantir que o script obtenha o personagem.
for _, child in pairs(Character:GetDescendants()) do
--Todo: Verificar se a parte precisa do grupo de colisão.
end
end)
Agora, precisamos verificar se o filho encontrado dentro do personagem é um Basepart. Fazemos isso usando uma declaração if com :IsA() para verificar se é um Basepart.
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player)--Criar uma variável para o jogador
local Character = player.Character or player.CharacterAdded:Wait() --Também adicionamos o CharacterAdded:Wait() para garantir que o script obtenha o personagem.
for _, child in pairs(Character:GetDescendants()) do
if child:IsA("BasePart") then
--Todo: Definir grupo de colisão.
end
end
end)
Agora que verificamos que o filho pode colidir, precisamos definir seu grupo de colisão, o que é bastante simples. Usaremos child.CollisionGroup.
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player)--Criar uma variável para o jogador
local Character = player.Character or player.CharacterAdded:Wait() --Também adicionamos o CharacterAdded:Wait() para garantir que o script obtenha o personagem.
for _, child in pairs(Character:GetDescendants()) do
if child:IsA("BasePart") then --Verifica se o filho é um basepart
child.CollisionGroup = "PlayerPart" --Defina "PlayerPart" como o nome do seu grupo de colisão.
end
end
end)
E agora está feito! A configuração foi concluída com sucesso. A partir deste ponto, seu jogador não deve mais colidir com outros jogadores dentro da experiência, evitando empurrões, bloqueios inesperados ou interferências durante a movimentação. Ao mesmo tempo, ele continuará funcionando normalmente com as outras partes do ambiente, mantendo a interação correta com plataformas, objetos, obstáculos e demais elementos físicos do jogo. Isso significa que o comportamento do personagem ficará mais consistente e adequado, especialmente em experiências com vários jogadores ao mesmo tempo. Cada jogador poderá se movimentar com mais liberdade, sem atrapalhar o caminho dos demais, enquanto ainda respeita as colisões importantes do cenário. Essa configuração é bastante útil para melhorar a jogabilidade, deixar a experiência mais fluida e evitar problemas comuns em mapas com espaços apertados ou muitos personagens próximos. Com tudo ajustado, seu **Personagem Personalizado** estará pronto para ser usado de forma mais eficiente, oferecendo uma movimentação mais limpa, organizada e compatível com o restante das partes do jogo.
Este é bem simples. Você pode ir até seu personagem personalizado em StarterPlayer (ou onde quer que esteja) e apenas adicionar o grupo de colisão individualmente. Se você não quiser fazer isso manualmente, então este é o script do tutorial do personagem padrão, ele deve funcionar bem na maior parte.
local PlayerService = game:GetService("Players") --Definir PlayerService
PlayerService.PlayerAdded:Connect(function(player)--Criar uma variável para o jogador
local Character = player.Character or player.CharacterAdded:Wait() --Também adicionamos o CharacterAdded:Wait() para garantir que o script obtenha o personagem.
for _, child in pairs(Character:GetDescendants()) do
if child:IsA("BasePart") then --Verifica se o filho é um basepart
child.CollisionGroup = "PlayerPart" --Defina "PlayerPart" como o nome do seu grupo de colisão.
end
end
end)
local PlayerService = game:GetService("Players")
PlayerService.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
for _, child in pairs(character:GetDescendants()) do
if child:IsA("BasePart") then
child.CollisionGroup = "PlayerPart"
end
end
end)
end)


