How do I set a part’s Friction and FrictionWeight while maintaining it’s already pre-existing physical properties? The documentation for physicalProperties is lacking or maybe it’s not possible.
I am not sure how to read a part’s existing physical properties. Some things like part.Friction exist, but things like part.Density or ElasticityWeight do not. part.PhysicalProperties throws an error, and part.CustomPhysicalProperties is nil before being set.
You can read a part’s physical properties through part.CustomPhysicalProperties[property]. The only time you can’t do this is when the part has no CustomPhysicalProperties, in which case you need to use:
Here’s a quick function that lets you change only specific properties easily
local function changePhysicalProperties(part, propTable)
if not part:IsA("BasePart")then
error("1st argument must be a BasePart")
end
if type(propTable) ~= "table" then
error("2nd argument must be a table")
end
if not part.CustomPhysicalProperties then
part.CustomPhysicalProperties = PhysicalProperties.new(part.Material) -- uses the material's physical properties as a basis for the part
end
local orig = part.CustomPhysicalProperties
local density = propTable.Density or orig.Density
local friction = propTable.Friction or orig.Friction
local elasticity = propTable.Elasticity or orig.Elasticity
local frictionWeight = propTable.FrictionWeight or orig.FrictionWeight
local elasticityWeight = propTable.ElasticityWeight or orig.ElasticityWeight
part.CustomPhysicalProperties = PhysicalProperties.new(density, friction, elasticity, frictionWeight, elasticityWeight)
end
local newProperties = {Friction = 0.3, FrictionWeight = 0.7} -- set up a dictionary for the properties
changePhysicalProperties(script.Parent, newProperties) -- use your part instead of script.Parent
if you don’t want type checking and are only going to change friction and friction weight you can just shorten it to this
local function changeFriction(part, friction, frictionWeight)
if not part.CustomPhysicalProperties then
part.CustomPhysicalProperties = PhysicalProperties.new(part.Material) -- uses the material's physical properties as a basis for the part
end
local orig = part.CustomPhysicalProperties
friction = friction or orig.Friction
frictionWeight = frictionWeight or orig.FrictionWeight
part.CustomPhysicalProperties = PhysicalProperties.new(orig.Density, friction, orig.Elasticity, frictionWeight, orig.ElasticityWeight)
end
changePhysicalProperties(--[[part here]], --[[friction here]], --[[frictionweight here]]) -- put nil for friction if you don't want it to change
Great solution, just to correct your shortened version you have the function named changePhysicalProperties when it’s listed as changeFriction for anyone also hoping to use this.