Roblox has been growing and evolving as a platform for 12 years, and it’s only natural that some things that made perfect sense for Roblox 12 years ago might not make sense now.
Our surface-based building system used to be a hallmark of the platform. Today, we have better alternatives for building. The behavior of the surface based building system often confuses new users and is avoided by most experienced builders.
We are planning to make some changes to make the behavior of these surface based joints less confusing, and more consistent with our newer constraints as we move towards deprecating and de-emphasizing the use of surface types in the future.
We don’t expect this to break any games, but we still recommend opting-in early and testing your games now!
Why we’re Changing this
Historically, when you place studs and inlets together in Studio and start the game, we run something like
Workspace:MakeJoints every time. This tests every part in the workspace for surface proximity and surface compatibility with nearby parts and creates
JointInstance joints corresponding to the surface type, like
Rotate. These joints are added to
JointsService, a hidden service, who’s children are replicated but not saved in the place file. Every time we load the place we need to do this all over again.
This also means the “Join” setting for drag tools in Studio can be misleading. Even if the join setting was set to “Never” while you were building, those joints may still be created when you start the game.
Also, changing the
Scale properties of a part will break any of these joints connected to the part—and possibly create new ones. Any joints it creates will also be hidden in
JointsService. When we investigated use of this property, we found that the games creating joints this way were mostly doing it by accident. Where joints were intended, MakeJoints was also called. Nobody seemed to be able to rely on this actually working.
We’ve opted to make some changes to the behavior of these joints so it’s more consistent and explicit. This way these joints won’t pop up by surprise—and if they do, they will be simple to understand. No secrets, no magic involved. No need to learn new concepts just so you can successfully avoid them.
We’ve added a new Workspace property:
AutoJointsMode, accessible in Studio. There are 3 options available:
Default: Use the current default value. Currently Explicit as of January 7th. Used to mean Legacy.
Explicit: The new mode. This gives you an opportunity to opt in early and test your game now.
LegacyImplicit: The old mode. This is a temporary opt-out to buy you more time to report issues and fix your games.
Here’s a video demonstrating some of these changes. I made JointsService visible for demonstration. It’s normally hidden.
When you opt in with
All hidden joints in your place will be moved into Workspace as children of one of their parts, similar to
- This is reversible. Changing back to
LegacyImplicitwill move joints created this way out of Workspace.
- This is reversible. Changing back to
These joints will now be saved in the place file, so you get consistent results when starting the game.
The Studio drag tools will continue to create joints, if Join is enabled.
- Additional joints created with drag tools will appear in the explorer under their parts, similar to ManualWelds.
- If Never is selected, no joints will be created. When running, the game parts will not be joined.
Workspace:MakeJointswill not run when a game is loaded. What you see is what you get.
- This can also make server start slightly faster for Explicit mode places with many parts in Workspace.
BasePartproperty setters will no longer implicitly
MakeJoints. The respective C0/C1 CFrame of any
JointInstancejoints will be updated to allow the part to move, similar to
BasePartproperty setters will no longer perform a “safe move” and will not attempt to position the part so it does not intersect other parts.
Model:MoveTocan be used if you want this.
The following methods will continue to make or break joints as before. New joints will be added as children of the part(s).
Model:MoveTo(also continues to do a “safe move”)
JointInstancejoints will no longer remove themselves if one of their parts is removed from Workspace
- This allows you to move models in and out of workspace without welds disappearing.
- This was needed in the past to clean up hidden JointsService joints, but is not needed when they are children of parts.
One significant change is that these formerly “implicit” joints will now be cloned with a Model because the Model will contain these joints as children.
We are now adding some metadata to model files. Models that are created in an Explicit mode workspace will not automatically call MakeJoints when imported in an Explicit mode workspace. Models made in this mode will have joints saved inside the model. Joints that do not exist in the model will not be added, even if there are compatible surfaces.
Motor6D) are considered deprecated. In general we recommend using
Constraints in place of JointInstances, with the exception of Motor6D for animation.
When is This Going Into Effect?
Now! You can change the AutoJointsMode property on Workspace to “Explicit” in Studio right now to opt-in your places now and test it. You can also select “LegacyImplicit” to opt out until we force this globally.
As of January 7th, If you have taken no action or AutoJointsMode is still set to Default, then the new Explicit mode will be used when you load the place in Studio or when a server starts. You can still select LegacyImplicit to temporarily opt out at this time.
On Febuary 4th, we will force Explicit everywhere. The LegacyImplicit option to opt out will be disabled and the AutoJointsMode property will be hidden in Studio. Old places will be converted when loaded in studio or during server startup.
We may adjust this schedule if we run into bugs or unforeseen issues in games. Please report any issues you run into!
What You Should Test
We expect these changes to be backwards compatible with most games.
One significant change is that joints will now be cloned with their parts. If your game somehow relies on models cloned from Workspace to not contain any surface-based joints, you may encounter some issues.
You may also encounter issues if your game looks for joints under JointsService that it did not explicitly add there itself. We don’t expect this is common.