Currently, I'm making use of a time attribute in the workspace; to which a UI listens for changes to and updates itself accordingly. Like so:
workspace:GetAttributeChangedSignal("Time"):Connect(function()
label.Text = workspace:GetAttribute("Time")
end)
Although it works perfectly fine, it seems a little inelegant to me. Is there another/better way of tracking time, which does not involve IntValues or attributes?
Is it better if I use a remote event instead? For example:
-- server script
local timer = 15
while timer > 0 do
remote:FireAllClients(timer)
wait(1)
timer -= 1
end
-- local script
remote.OnClientEvent:Connect(function(timer)
label.Text = timer
end)

2 comments
To give the client the current value of the timer make an Attribute or Intvalue displaying it and get changed signal.
I take it that there's no better way. Since you're the only answer I'll accept it.