✓ Accepted answer
SurfaceGui objects work exactly the same as ScreenGui objects, containing GUI objects to be presented.
They simply either require their Adornee property to be set to the part they are on, or to be the child of a part.
(Full list of SurfaceGui properties)
In addition, you should configure the CanvasSize of the SurfaceGui, which is a Vector2. CanvasSize affects what an "offset" is for UDim2 (the width / height / length of a part is split into the resolution you give it in CanvasSize).
What is less obvious about CanvasSize is that it also represents the resolution to which objects can be positioned, i.e., even if you only use Scale in UDim2's to position elements, very low CanvasSizes could cause artifacts.
4 comments
Cool, thanks for the info!
Also, just realized why the buttons didn't work last time I tried it! The form of whatever it's on HAS to be a brick!
What were you using before?
A custom part. Really annoying how it has to be a brick... Well, I just re-sized teh GUI afterwards.