When creating a BillboardGui and setting its Adornee property to a part that is parented to nil, parenting the Adornee only causes the BillboardGui to show on the client until the BillboardGui is updated (anything that causes the AncestryChanged event to fire).
I’m posting this in studio bugs because while it technically affects live games, there is no way to see the server’s rendered view of the workspace in a live game.
Repro script:
-- INSTRUCTIONS
-- 1. Playtest the game
-- Notice the BillboardGui rendering
-- 2. Switch to server view
-- Notice the BillboardGui NOT rendering
-- 3. Parent the BillboardGui to any descendant of workspace
-- Notice the BillboardGui begin to render again
-- Code to create the Billboard and part
local billboard = Instance.new("BillboardGui", workspace)
billboard.Size = UDim2.new(1, 0, 1, 0)
billboard.AlwaysOnTop = true
local frame = Instance.new("Frame", billboard)
frame.Size = billboard.Size
frame.BackgroundColor3 = Color3.new(1, 0, 0)
local part = Instance.new("Part")
-- Code below causes the bug, swapping the two lines fixes it
billboard.Adornee = part
part.Parent = workspace
-- That's so frightening.
Expected behavior: the BillboardGui renders on the server as soon as the Adornee is parented to Workspace
What actually happens: the client can see the BillboardGui, but the server can’t until it is reparented.