I’ve searched for a few hours trying to look for a solution, but all I’ve come up with is a Vector3:Dot() system that’s seemingly ineffective.
local rs = game:GetService("RunService")
local frame = script.Parent.Frame
local target = workspace.Rig
local player = game.Players.LocalPlayer
local char = player.Character or player.CharacterAdded:Wait()
local cam = workspace.CurrentCamera
rs.RenderStepped:Connect(function()
local unitDir = (char.PrimaryPart.Position - workspace.Rig.PrimaryPart.Position).Unit
local mainDir = cam.CFrame.LookVector:Dot(unitDir)
frame.Rotation = mainDir * 180
end)
Try using a BillboardGui, it will always be at the position of an object in workspace you parent it under, and you can set an offset to the position if needed.
If you need the GUI always visible to the player, you can use the AlwaysOnTop property.