Ability to link certain instance properties with 'PropertyValues'?

The Inconvenience


Currently, in order to adjust a property of any instance you need to make use of a script (or do it manually by hand). This is okay for e.g a GUI of which you need to edit 2 BackgroundColor3’s.
But imagine trying to make a ‘library’ of GUIs with different appearances where you have to adjust a lot of BackgroundColor3’s by hand …
Well you can make a script but sometimes it’s faster to do it by hand regardless.

A Potential Solution


So this just popped into my mind: ‘PropertyValues’.
The PropertyValues class would work similar to Values in terms of what data they carry. But instead of them just carrying data, you can make them replace properties of multiple instances from classes such as BaseParts or GuiBase.

Here’s what I meant in practice:

Bad example

You have a large dance floor that needs the same BrickColor and want to make them all change in-game without having to write a complex script because you never programmed before. Instead you’d use a PropertyValue and put it in ReplicatedStorage. Then you select all the parts, click on a button next to the Color or BrickColor and select the PropertyValue resulting in them being linked (similar to how PrimaryParts work). Now, when you adjust the PropertyValue’s value, it’d change all the parts’ colors simultaneously!

Imagine this GUI you’re making: A certain colourscheme (aka. multiple colours), multiple sizes, background transparencies, text, fonts, icons, etc.

Instead of making a script that big, use the PropertyValue.

You’d be able to link multiple instances (in this case e.g Frames) to 1 PropertyValue, to make editing a whole bunch easier both live and in-studio.

For example:
If I have many GUIs with the same BackgroundColor3 in a hierairchy such as the second image I’d just have to link those GUIs with 1 PropertyValue of the same colour.

I think that this could be convenient for not only new developers but also experienced developers who can’t script themselves that well or people who can’t be bothered to make a script for that.

I hope I explained this well, I feel like I used a bad example. In case you have questions, please do let me know in the replies. :smiley:

4 Likes

While this is an interesting concept, you can also easily do this with a Color3Value, BoolValue, StringValue, or IntValue object as those are values that are similar to a value that a property can hold. All you would need to do is make a script that checks the changes to that value like so:

local Color3Value = -- make a Color3Value and link it here.
local Model = -- get the location of the parts that need color changing.

Color3Value.Changed:Connect(function(property)
	if tostring(property) == "Value" then
		for k, v in pairs(Model:GetChildren()) do
			if v:IsA("BasePart") then
				v.Color = Color3Value.Value
				-- or: v.BrickColor = BrickColor.new(Color3Value.Value)
			end
		end
	end
end)
2 Likes

To be of any use when editing the UI real-time, this script would need to be part a plugin.

Having a plugin for this wouldn’t be a bad solution, but I can see extended use cases where it’d still be better to have a built-in object.

For example, being able to procedurally position/resize/etc. UI elements and physical objects would also be pretty useful – and they come under the theme of linking values to objects.

Maybe on its own, this feature isn’t worth it, but if given additional functionality it could fill a lot of uses.

1 Like

That is a way to solve it. But not everyone knows how to script that properly. Especially in bigger hierarchies (such as the library I’d be making) it can get very complex to script such things.
Besides, you’d have to integrate that script with whatever scripts you already have, if that makes sense.

It would be a whole lot easier to just link it with a PropertyValue. Because then you wouldn’t have to use a for-loop followed by an if-statement to check whether it’s got the right ClassName or Name or whatever. You’d just have to change that PropertyValue’s value, which would change every property linked to it.