score = 0 brick = game.Workspace.Part gui = game.StarterGui.ScreenGui.TextLabel gui.Text = "Score: " .. score function touch(part) score = score + 1 gui.Text = "Score: " .. score brick:Destroy() end brick.Touched:connect(touch)
This is my code that I tried to use to show the score on a gui. The score stays 0 when I touch the brick. When i do go to the properties of the textlabel, it says the property text has the value of "Score: 1" but it does not show up on the screen.
StarterGui
is a folder that stores things to be given to the player - it does not control the actual GUIs the player is seeing. You will find that respawning updates the gui, because StarterGui
will by default clear the player's PlayerGui
, then clone StarterGui
's content into it.
As well as this, this will update the GUI for all players, something which I believe you do not want to happen from look at your code.
Here's the fixed version of the code:
local part = workspace:WaitForChild("Part") --// WaitForChild makes sure that the part is loaded before trying to index it local playerScores = {} --// For later use, note that this style is not recommended in most cases, but will accomplish what you need part.Touched:connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player then --// If what touched the part was from a player local gui = player.PlayerGui:FindFirstChild("ScreenGui") --// Sees if the GUI exists before attempting to index it (will error otherwise) if gui then --// If the GUI does indeed exist local text = gui:WaitForChild("TextLabel") --// Waits for the TextLabel if not playerScores[player] then --// If a player does not have a set score playerScores[player] = 0 --// Sets the value if it does not exist end playerScores[player] = playerScores[player] + 1 --// Adds 1 to the score text.Text = "Score:" ..playerScores[player] --// Sets the text end end end)
Hope I helped! If you need more help, please ask.
~TDP