--LocalScript inside StarterPlayerScripts
player = game.Players.LocalPlayer

local sp = player:WaitForChild('PlayerGui'):WaitForChild('Keybind'):WaitForChild('ImageButton')

local UIS = game:GetService("UserInputService")

UIS.InputBegan:Connect(function(input,gameProcessed)

	if input.UserInputType == Enum.UserInputType.Keyboard  then
		if input.KeyCode == Enum.KeyCode.E then
			if UIS:GetFocusedTextBox() == nil then

				for i,v in pairs(game.Workspace.Stove["Gas"]:GetChildren()) do

					local mag = (v.Parent.Union.Position-game.Players.LocalPlayer.Character.HumanoidRootPart.Position).Magnitude

					if mag <= 15 then

						game.ReplicatedStorage.Stove:FireServer("Gas")

					end
				end
			end
		end
	end
end)

while wait() do

	for i,v in pairs(game.Workspace.Stove["Gas"]:GetChildren()) do
		local mag = (v.Parent.Union.Position-game.Players.LocalPlayer.Character.HumanoidRootPart.Position).Magnitude
		local WSP = game.Workspace.CurrentCamera:WorldToScreenPoint(v.Parent.Union.Position)

		if mag <= 15 then 
			sp.Visible = true

			sp.Position = UDim2.new(0,WSP.X,0,WSP.Y)

			sp.TextLabel.Text = "Open 'Stove'"

		end
	end
end

This is my keybind script. If you go near it, an ImageButton 'E' will appear, and if you click this, it will fire an remoteEvent. But I see a problem that is the button is blinking(because the while loop and the for loop, and it means there is a delay). If you just add one more line of a script then the blinking period(the sp.Visible = false) increases. What do I do? [There are tons of stoves in the folder]