game.Players.ChildAdded:connect(function(player)
player.CharacterAdded:connect(function(char)
local plyrGuiH = Instance.new("BillboardGui")
plyrGuiH.Name = "HealthOverlay"
plyrGuiH.Parent = char.Head
plyrGuiH.Adornee = char.Head
plyrGuiH.Size = UDim2.new (1,0,1,0,0,0)
plyrGuiH.StudsOffset = Vector3.new (0,1.2,0)
--plyrGuiH.PlayerToHideFrom = player
local frame = Instance.new("Frame")
frame.Parent = plyrGuiH
frame.Size = UDim2.new (0,180,0,10)
frame.BackgroundColor3 = Color3.fromRGB (9, 33, 49)
local overlay = Instance.new("Frame")
overlay.Parent = frame
overlay.Name = "Overlay"
overlay.BackgroundColor3 = Color3.fromRGB (255, 24, 58)
overlay.Size = UDim2.new (0,180,0,10)
game.StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Health, false)
local players = game.Players.LocalPlayer
repeat wait() until players.Character
local Humanoid = players.Character:WaitForChild("Humanoid")
local HealthMath = Humanoid.Health / (Humanoid.MaxHealth)
script.Parent = overlay
script.Parent:TweenSize(UDim2.new(HealthMath, 0, 1, 0), "Out", "Sine", .5)
Humanoid.HealthChanged:connect(function()
local HealthMath = Humanoid.Health / (Humanoid.MaxHealth)
script.Parent:TweenSize(UDim2.new(HealthMath, 0, 1, 0), "Out", "Sine", .5)
end)
end)
end)
When enter the game, the billboard is there , but after reset the character it is gone.

3 comments
Suggest parenting it inside of PlayerGui, setting it to not reset on respawn, and adornee it to the head as you already do.
Still disappear :c
You gotta set the adornee again when a new character gets added, since the old Head is gone.