Collision Groups aren't working

Hi, I made a No-Collide script for players, for some reason it doesn’t wanna work. I don’t know what I’ve done wrong.
Here’s the code:

local pyService = game:GetService("PhysicsService")

local PlayerGroup = pyService:CreateCollisionGroup("Players")

pyService:CollisionGroupSetCollidable("Players", "Players", false)

function CanCollide(model)
    for x, v in pairs(model:GetChildren()) do
        if v:IsA("BasePart") then
            pyService:SetPartCollisionGroup(v, "Players")
        end
    end
end

game.Players.PlayerAdded:Connect(function(Plr)
    Plr.CharacterAdded:Connect(function(character)
        CanCollide(character)
    end)
end)

I assume the reason is because the character appearance isn’t fully loaded yet when you fire the CanCollide function so some character meshes are left out. You can try to switch Plr.CharacterAdded with Plr.CharacterAppearanceLoaded event which fires when all objects in the character model are loaded instead of when the character model is added without anything inside it.

9 Likes

You can also do Player:WaitForChild(“Character”)
Edit it does not work, try other solutions here.

Try use this:

local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
 
local playerCollisionGroupName = "Players"
PhysicsService:CreateCollisionGroup(playerCollisionGroupName)
PhysicsService:CollisionGroupSetCollidable(playerCollisionGroupName, playerCollisionGroupName, false)
 
local previousCollisionGroups = {}
 
local function setCollisionGroup(object)
  if object:IsA("BasePart") then
    previousCollisionGroups[object] = object.CollisionGroupId
    PhysicsService:SetPartCollisionGroup(object, playerCollisionGroupName)
  end
end
 
local function setCollisionGroupRecursive(object)
  setCollisionGroup(object)
 
  for _, child in ipairs(object:GetChildren()) do
    setCollisionGroupRecursive(child)
  end
end
 
local function resetCollisionGroup(object)
  local previousCollisionGroupId = previousCollisionGroups[object]
  if not previousCollisionGroupId then return end 
 
  local previousCollisionGroupName = PhysicsService:GetCollisionGroupName(previousCollisionGroupId)
  if not previousCollisionGroupName then return end
 
  PhysicsService:SetPartCollisionGroup(object, previousCollisionGroupName)
  previousCollisionGroups[object] = nil
end
 
local function onCharacterAdded(character)
  setCollisionGroupRecursive(character)
 
  character.DescendantAdded:Connect(setCollisionGroup)
  character.DescendantRemoving:Connect(resetCollisionGroup)
end
 
local function onPlayerAdded(player)
  player.CharacterAdded:Connect(onCharacterAdded)
end
 
Players.PlayerAdded:Connect(onPlayerAdded)

This won’t work because Character is a property of the Player object, not child.

1 Like

Thank you, I am trying it right now