Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How do you make something fade, from a color to another color?

How do you make something fade, from a color to another color? Like, when you touch a brick, it turns from "Black", to "Red", how would you do that? You would have to use the "Touched" event correct? But I am kind of confused, I never tried this I'm just having trouble of thinking of what I'd do. Could someone demonstrate me, by giving out an example? It'd be a function correct?

1 answer

@haillin's answer fades the part out (transparent) and then changes the color, which I don't think is the question you are asking?

Unfortunately, ROBLOX doesn't allow you to have continuous colors for the BrickColor of a Part. Only the set palette of BrickColors can be used.

Luckily, they do allow this to be done with SpecialMesh's.

Here is how you could make the part fade, which you could do on Touched. Most likely, you should remember to make some sort of debounce system so it will not start fading again until it finishes. This snippet includes that.

I assume the Script is parented to the Part in question, and that it has a SpecialMesh called Mesh using the following mesh:

http://www.roblox.com/Mini-Brick-item?id=9857022

and with a Texture of solid white (just search through free decals).

local fading = false;

script.Parent.Mesh.Scale = script.Parent.Size * 2;

function touched()
	if fading then
		-- We will not start fading again
		-- until the first fade finishes
		return;
	end
	fading = true;
	local black = Vector3.new(0,0,0);
	local red= Vector3.new(0,0,1);
	-- VertexColor has same values as a Color3,
	-- but it's stored as a Vector3
	for i = 0,1,0.1 do
		local col = black * (1-i) + red * i;
		-- The previous line is a "linear interpolation"
		-- between black and red.
		-- Basically, it's a weighted average, where the
		-- weight goes from totally black to totally red
		-- as a linear function.
		script.Parent.Mesh.VertexColor = col;
		wait(0.03); 
	end
	fading = false; -- Let everyone know
	-- that we can start fading again
end

This solution has other limitations, unfortunately. If you use a mesh, you won't be able to see the material of a part, or any of its surfaces. It also won't have outlines.

EDIT: A more modular approach

Thinking on this, there's a much cleaner way to manage fading. We can make ourselves a fade function which lets us use this in more contexts than just the touched event in a clean way.

function fade(part,from,to,time)
	time = time or 1; -- Default to 1 second
	for i = 0, 1, 1/(time/.03) do
		local col = from * (1-i) + to * i;
		part.Mesh.VertexColor = col;
		wait(0.03); 
	end
end

local fading = false;
function touched(h)
	if fading then
		return;
	end
	-- We can also check for things like
	-- are they a player here, of course
	fading = true;
	fade(script.Parent, Vector3.new(0,0,0), Vector3.new(1,0,0));
	fading = false;
end
script.Parent.Touched:connect(touched);

1 comment

0

Roblox now made it a feature!

This discussion is preserved as it was. New answers, comments, and votes are closed.