Skip to content

Commit

Permalink
Optimization of Collision Group Script (#984)
Browse files Browse the repository at this point in the history
## Changes

I've optimized the script for handling collision groups in Roblox. The
main change involves removing the connection to DescendantAdded,
applying the collision group immediately to all parts in the model upon
character addition. This reduces unnecessary event connections,
improving performance by applying the collision group once for all
descendants, rather than repeatedly when new parts are added. This
should help improve game performance, especially when handling many
parts or players.

## Checks

By submitting your pull request for review, you agree to the following:

- [x] This contribution was created in whole or in part by me, and I
have the right to submit it under the terms of this repository's open
source licenses.
- [x] I understand and agree that this contribution and a record of it
are public, maintained indefinitely, and may be redistributed under the
terms of this repository's open source licenses.
- [x] To the best of my knowledge, all proposed changes are accurate.

---------
  • Loading branch information
Lucatacos authored Jan 13, 2025
1 parent 9ee784e commit d7998a5
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions content/en-us/workspace/collisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,27 +262,27 @@ interesting but unintended gameplay, such as characters jumping on top of each o
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")

PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)

local function onDescendantAdded(descendant)
-- Set collision group for any part descendant
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
local CollisionGroupName = "Characters"
PhysicsService:RegisterCollisionGroup(CollisionGroupName)
PhysicsService:CollisionGroupSetCollidable(CollisionGroupName, CollisionGroupName, false)

local function setCollisionGroup(model)
-- Apply collision group to all existing parts in the model
for _, descendant in model:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.CollisionGroup = CollisionGroupName
end
end
end

local function onCharacterAdded(character)
-- Process existing and new descendants for physics setup
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end

Players.PlayerAdded:Connect(function(player)
-- Detect when the player's character is added
player.CharacterAdded:Connect(onCharacterAdded)
player.CharacterAdded:Connect(function(character)
setCollisionGroup(character)
end)
-- If the player already has a character, apply the collision group immediately
if player.Character then
setCollisionGroup(player.Character)
end
end)
```

Expand Down Expand Up @@ -360,4 +360,4 @@ The `Class.TriangleMeshPart.CollisionFidelity|CollisionFidelity` property has th
To view collision fidelity in Studio, toggle on **Collision fidelity** from the [Visualization Options](../studio/ui-overview.md#visualization-options) widget in the upper‑right corner of the 3D viewport.
</Alert>

For more information on the performance impact of collision fidelity options and how to mitigate them, see [Performance Optimization](../performance-optimization/improving.md#physics-computation). For an in‑depth walkthrough on how to choose a collision fidelity option that balances your precision needs and performance requirements, see [here](../tutorials/environmental-art/assemble-an-asset-library.md#collisionfidelity).
For more information on the performance impact of collision fidelity options and how to mitigate them, see [Performance Optimization](../performance-optimization/improving.md#physics-computation).

0 comments on commit d7998a5

Please sign in to comment.