3D Player HUD open source
Key RequiredUniversal

3D Player HUD open source

Universal ScriptAZ_SCRIBTAZ_SCRIBT 694 views 91 executesUpdated Dec 5, 2025
5.0/ 5(1 votes)
10100% Positive
Lua Script•493 lines (20000 chars)
--[[
===========================================
Roblox Heads and Accessories Management Script
===========================================

Current Issue:
- Heads do not hide properly when executing hide commands

Required Development:
1. Fix the hiding system
2. Add new features as needed
3. Handle any errors or exceptions

How to Contribute:
- You can modify any part of the code
- Improve the algorithms used
- Fix existing errors

Original Developer: AZ SCRIPT
Start Date: 2025/12/4

Note: This is an open-source project.
===========================================
]]
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Player = Players.LocalPlayer

if Player.PlayerGui:FindFirstChild("PerfectViewer") then
	Player.PlayerGui["PerfectViewer"]:Destroy()
end

local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "PerfectViewer"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = Player:WaitForChild("PlayerGui")
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

local ActivePopups = {} 

local Config = {
	AutoRotate = true,
	RotSpeed = 0.01,
	CamHeight = -0.5,
	
	Scales = {
		Head = 1, Torso = 1, Arms = 1, Legs = 1, Accessories = 1 
	},
	CurrentSelectedPart = "Head",
	Hidden = {Head=false, Torso=false, Arms=false, Legs=false, Acc=false},
	
	Transparency = 0,
	IsForceField = false,
	EffectColor = Color3.fromRGB(100, 255, 100),
	
	SolidColorEnabled = false,
	SolidColor = Color3.fromRGB(255, 255, 255)
}

local MainFrame = Instance.new("ImageLabel")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 220, 0, 300)
MainFrame.Position = UDim2.new(0, 20, 0.5, -150)
MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
MainFrame.BorderSizePixel = 0
MainFrame.Active = true 
MainFrame.Parent = ScreenGui

local MainCorner = Instance.new("UICorner") MainCorner.CornerRadius = UDim.new(0, 12) MainCorner.Parent = MainFrame
local MainStroke = Instance.new("UIStroke") MainStroke.Color = Color3.fromRGB(80, 80, 80) MainStroke.Thickness = 2 MainStroke.Parent = MainFrame

local Viewport = Instance.new("ViewportFrame")
Viewport.Size = UDim2.new(1, -10, 1, -50)
Viewport.Position = UDim2.new(0, 5, 0, 40)
Viewport.BackgroundTransparency = 0
Viewport.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
Viewport.Parent = MainFrame
Instance.new("UICorner", Viewport).CornerRadius = UDim.new(0, 8)

local WorldModel = Instance.new("WorldModel") WorldModel.Parent = Viewport
local Camera = Instance.new("Camera") Viewport.CurrentCamera = Camera Camera.Parent = Viewport

local ToggleBtn = Instance.new("TextButton")
ToggleBtn.Name = "ToggleBtn"
ToggleBtn.Size = UDim2.new(0, 30, 0, 30)
ToggleBtn.Position = UDim2.new(1, -35, 0, 5)
ToggleBtn.BackgroundTransparency = 1
ToggleBtn.Text = "⚙️"
ToggleBtn.TextSize = 24
ToggleBtn.TextColor3 = Color3.new(1,1,1)
ToggleBtn.Parent = MainFrame

local SettingsFrame = Instance.new("ScrollingFrame")
SettingsFrame.Name = "SettingsFrame"
SettingsFrame.Position = UDim2.new(0, 250, 0.5, -150)
SettingsFrame.Size = UDim2.new(0, 220, 0, 300)
SettingsFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
SettingsFrame.Visible = false
SettingsFrame.ScrollBarThickness = 3
SettingsFrame.ScrollBarImageColor3 = Color3.fromRGB(100, 100, 100)
SettingsFrame.BorderSizePixel = 0 
SettingsFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y 
SettingsFrame.CanvasSize = UDim2.new(0,0,0,0)
SettingsFrame.Parent = ScreenGui 

local SetCorner = Instance.new("UICorner") SetCorner.CornerRadius = UDim.new(0, 12) SetCorner.Parent = SettingsFrame
local SetStroke = Instance.new("UIStroke") SetStroke.Color = Color3.fromRGB(80, 80, 80) SetStroke.Thickness = 2 SetStroke.Parent = SettingsFrame

local ListLayout = Instance.new("UIListLayout")
ListLayout.Parent = SettingsFrame
ListLayout.SortOrder = Enum.SortOrder.LayoutOrder
ListLayout.Padding = UDim.new(0, 10) 
ListLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center

local Padding = Instance.new("UIPadding")
Padding.Parent = SettingsFrame
Padding.PaddingTop = UDim.new(0, 15)
Padding.PaddingBottom = UDim.new(0, 15)

ToggleBtn.MouseButton1Click:Connect(function()
	SettingsFrame.Visible = not SettingsFrame.Visible
	ToggleBtn.Text = SettingsFrame.Visible and "✖" or "⚙️"
	ToggleBtn.TextColor3 = SettingsFrame.Visible and Color3.fromRGB(255, 80, 80) or Color3.fromRGB(255, 255, 255)
	
	if not SettingsFrame.Visible then
		for _, data in pairs(ActivePopups) do
			data.Popup.Visible = false
		end
	end
end)

local function CreateColorPicker(name, defaultColor, callback, order)
	local Container = Instance.new("Frame")
	Container.Size = UDim2.new(0.9, 0, 0, 30)
	Container.BackgroundTransparency = 1
	Container.LayoutOrder = order or 0
	Container.Parent = SettingsFrame
	
	local Label = Instance.new("TextLabel")
	Label.Size = UDim2.new(0.7, 0, 1, 0)
	Label.BackgroundTransparency = 1
	Label.Text = name
	Label.TextColor3 = Color3.new(0.9, 0.9, 0.9)
	Label.TextXAlignment = Enum.TextXAlignment.Left
	Label.TextSize = 12
	Label.Parent = Container
	
	local ColorPreviewBtn = Instance.new("TextButton")
	ColorPreviewBtn.Size = UDim2.new(0, 25, 0, 25)
	ColorPreviewBtn.Position = UDim2.new(1, -30, 0, 2)
	ColorPreviewBtn.BackgroundColor3 = defaultColor
	ColorPreviewBtn.Text = ""
	ColorPreviewBtn.Parent = Container
	Instance.new("UICorner", ColorPreviewBtn).CornerRadius = UDim.new(0, 6)
	local PreviewStroke = Instance.new("UIStroke") PreviewStroke.Color = Color3.new(1,1,1) PreviewStroke.Thickness = 1 PreviewStroke.Parent = ColorPreviewBtn
	
	local PickerPopup = Instance.new("Frame")
	PickerPopup.Name = "ColorPopup"
	PickerPopup.Size = UDim2.new(0, 150, 0, 160)
	PickerPopup.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
	PickerPopup.Visible = false
	PickerPopup.ZIndex = 100 
	PickerPopup.Parent = ScreenGui 
	
	Instance.new("UICorner", PickerPopup).CornerRadius = UDim.new(0, 8)
	local PopStroke = Instance.new("UIStroke") PopStroke.Color = Color3.fromRGB(80,80,80) PopStroke.Thickness = 1 PopStroke.Parent = PickerPopup
	
	table.insert(ActivePopups, {Popup = PickerPopup, Button = ColorPreviewBtn})
	
	local h, s, v = Color3.toHSV(defaultColor)
	
	local SVBox = Instance.new("ImageButton")
	SVBox.Size = UDim2.new(1, -20, 0, 100)
	SVBox.Position = UDim2.new(0, 10, 0, 10)
	SVBox.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
	SVBox.AutoButtonColor = false
	SVBox.Image = ""
	SVBox.ZIndex = 101
	SVBox.Parent = PickerPopup
	
	local SatLayer = Instance.new("Frame")
	SatLayer.Size = UDim2.new(1,0,1,0)
	SatLayer.BackgroundColor3 = Color3.new(1,1,1)
	SatLayer.BorderSizePixel = 0
	SatLayer.ZIndex = 102
	SatLayer.Parent = SVBox
	local SatGrad = Instance.new("UIGradient")
	SatGrad.Transparency = NumberSequence.new{NumberSequenceKeypoint.new(0, 0), NumberSequenceKeypoint.new(1, 1)}
	SatGrad.Parent = SatLayer
	
	local ValLayer = Instance.new("Frame")
	ValLayer.Size = UDim2.new(1,0,1,0)
	ValLayer.BackgroundColor3 = Color3.new(0,0,0)
	ValLayer.BorderSizePixel = 0
	ValLayer.ZIndex = 103
	ValLayer.Parent = SVBox
	local ValGrad = Instance.new("UIGradient")
	ValGrad.Rotation = 90
	ValGrad.Transparency = NumberSequence.new{NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(1, 0)}
	ValGrad.Parent = ValLayer
	
	local SVCursor = Instance.new("Frame")
	SVCursor.Size = UDim2.new(0, 10, 0, 10)
	SVCursor.AnchorPoint = Vector2.new(0.5, 0.5)
	SVCursor.BackgroundColor3 = Color3.new(1,1,1)
	SVCursor.ZIndex = 104
	SVCursor.Parent = SVBox
	Instance.new("UICorner", SVCursor).CornerRadius = UDim.new(1,0)
	Instance.new("UIStroke", SVCursor).Thickness = 2 
	
	local HueBar = Instance.new("ImageButton")
	HueBar.Size = UDim2.new(1, -20, 0, 20)
	HueBar.Position = UDim2.new(0, 10, 0, 120)
	HueBar.BackgroundColor3 = Color3.new(1,1,1)
	HueBar.AutoButtonColor = false
	HueBar.Image = ""
	HueBar.ZIndex = 101
	HueBar.Parent = PickerPopup
	Instance.new("UICorner", HueBar).CornerRadius = UDim.new(0, 4)
	
	local HueGrad = Instance.new("UIGradient")
	HueGrad.Color = ColorSequence.new{
		ColorSequenceKeypoint.new(0, Color3.new(1,0,0)), ColorSequenceKeypoint.new(0.167, Color3.new(1,1,0)),
		ColorSequenceKeypoint.new(0.333, Color3.new(0,1,0)), ColorSequenceKeypoint.new(0.5, Color3.new(0,1,1)),
		ColorSequenceKeypoint.new(0.667, Color3.new(0,0,1)), ColorSequenceKeypoint.new(0.833, Color3.new(1,0,1)),
		ColorSequenceKeypoint.new(1, Color3.new(1,0,0))
	}
	HueGrad.Parent = HueBar
	
	local HueCursor = Instance.new("Frame")
	HueCursor.Size = UDim2.new(0, 6, 1, 4)
	HueCursor.Position = UDim2.new(h, 0, 0.5, 0)
	HueCursor.AnchorPoint = Vector2.new(0.5, 0.5)
	HueCursor.BackgroundColor3 = Color3.new(1,1,1)
	HueCursor.BorderSizePixel = 0
	HueCursor.ZIndex = 105
	HueCursor.Parent = HueBar
	
	local function UpdateColor()
		local finalColor = Color3.fromHSV(h, s, v)
		ColorPreviewBtn.BackgroundColor3 = finalColor
		SVBox.BackgroundColor3 = Color3.fromHSV(h, 1, 1)
		SVCursor.BackgroundColor3 = finalColor
		HueCursor.Position = UDim2.new(h, 0, 0.5, 0)
		SVCursor.Position = UDim2.new(s, 0, 1 - v, 0)
		callback(finalColor)
	end
	
	local hueDragging = false
	HueBar.InputBegan:Connect(function(input) 
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then hueDragging = true end 
	end)
	
	local svDragging = false
	SVBox.InputBegan:Connect(function(input) 
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then svDragging = true end 
	end)
	
	UserInputService.InputEnded:Connect(function(input) 
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then 
			hueDragging = false 
			svDragging = false 
		end 
	end)
	
	UserInputService.InputChanged:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
			if hueDragging then
				local relX = math.clamp((input.Position.X - HueBar.AbsolutePosition.X) / HueBar.AbsoluteSize.X, 0, 1)
				h = relX
				UpdateColor()
			elseif svDragging then
				local relX = math.clamp((input.Position.X - SVBox.AbsolutePosition.X) / SVBox.AbsoluteSize.X, 0, 1)
				local relY = math.clamp((input.Position.Y - SVBox.AbsolutePosition.Y) / SVBox.AbsoluteSize.Y, 0, 1)
				s = relX
				v = 1 - relY
				UpdateColor()
			end
		end
	end)
	
	ColorPreviewBtn.MouseButton1Click:Connect(function()
		for _, data in pairs(ActivePopups) do
			if data.Popup ~= PickerPopup then
				data.Popup.Visible = false
			end
		end
		
		if not PickerPopup.Visible then
			local btnAbsPos = ColorPreviewBtn.AbsolutePosition
			PickerPopup.Position = UDim2.new(0, btnAbsPos.X + 35, 0, btnAbsPos.Y - 50)
		end
		
		PickerPopup.Visible = not PickerPopup.Visible
	end)
	
	UpdateColor()
end

UserInputService.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		local clickPos = input.Position
		for _, data in pairs(ActivePopups) do
			if data.Popup.Visible then
				local function IsInFrame(frame)
					local absPos = frame.AbsolutePosition
					local absSize = frame.AbsoluteSize
					return clickPos.X >= absPos.X and clickPos.X <= absPos.X + absSize.X
						and clickPos.Y >= absPos.Y and clickPos.Y <= absPos.Y + absSize.Y
				end
				if not IsInFrame(data.Popup) and not IsInFrame(data.Button) then
					data.Popup.Visible = false
				end
			end
		end
	end
end)


local function CreateHeader(text, order)
	local L = Instance.new("TextLabel")
	L.Size = UDim2.new(0.9, 0, 0, 20)
	L.BackgroundTransparency = 1
	L.Text = text
	L.TextColor3 = Color3.fromRGB(255, 170, 0)
	L.Font = Enum.Font.GothamBold
	L.TextSize = 13
	L.LayoutOrder = order or 0
	L.Parent = SettingsFrame
end

local function CreateSlider(name, min, max, default, callback, updateRef, order)
	local F = Instance.new("Frame") F.Size = UDim2.new(0.9, 0, 0, 40) F.BackgroundTransparency = 1 F.LayoutOrder = order or 0 F.Parent = SettingsFrame
	local L = Instance.new("TextLabel") L.Size = UDim2.new(1, 0, 0, 15) L.BackgroundTransparency = 1 L.Text = name L.TextColor3 = Color3.new(0.9,0.9,0.9) L.TextXAlignment = Enum.TextXAlignment.Left L.TextSize = 11 L.Parent = F
	local Bar = Instance.new("Frame") Bar.Size = UDim2.new(1, 0, 0, 6) Bar.Position = UDim2.new(0, 0, 0.6, 0) Bar.BackgroundColor3 = Color3.fromRGB(50,50,50) Bar.BorderSizePixel = 0 Bar.Parent = F
	Instance.new("UICorner", Bar).CornerRadius = UDim.new(1,0)
	local Fill = Instance.new("Frame") Fill.Size = UDim2.new(0,0,1,0) Fill.BackgroundColor3 = Color3.fromRGB(0, 170, 255) Fill.BorderSizePixel = 0 Fill.Parent = Bar
	Instance.new("UICorner", Fill).CornerRadius = UDim.new(1,0)
	local Knob = Instance.new("TextButton") Knob.Size = UDim2.new(0,14,0,14) Knob.AnchorPoint = Vector2.new(0.5,0.5) Knob.BackgroundColor3 = Color3.new(1,1,1) Knob.Text="" Knob.Parent=Bar
	Instance.new("UICorner", Knob).CornerRadius = UDim.new(1,0)
	
	local function UpdateVisuals(ratio) Knob.Position = UDim2.new(math.clamp(ratio, 0, 1), 0, 0.5, 0) Fill.Size = UDim2.new(ratio, 0, 1, 0) end
	local function UpdateFromVal(val) local ratio = (val - min) / (max - min) UpdateVisuals(ratio) end
	UpdateFromVal(default)
	if updateRef then updateRef.Update = UpdateFromVal end

	local dragging = false
	Knob.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging = true end end)
	UserInputService.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging = false end end)
	UserInputService.InputChanged:Connect(function(i)
		if dragging and (i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch) then
			local mX = i.Position.X
			local rel = math.clamp((mX - Bar.AbsolutePosition.X) / Bar.AbsoluteSize.X, 0, 1)
			UpdateVisuals(rel)
			callback(min + (rel * (max - min)))
		end
	end)
end

local function CreateToggle(text, default, callback, order)
	local B = Instance.new("TextButton") B.Size = UDim2.new(0.9, 0, 0, 25) B.BackgroundColor3 = default and Color3.fromRGB(0,180,0) or Color3.fromRGB(40,40,40) B.Text = text B.TextColor3 = Color3.new(1,1,1) B.TextSize = 11 B.LayoutOrder = order or 0 B.Parent = SettingsFrame
	Instance.new("UICorner", B).CornerRadius = UDim.new(0,6)
	B.MouseButton1Click:Connect(function() local newVal = callback() B.BackgroundColor3 = newVal and Color3.fromRGB(0,180,0) or Color3.fromRGB(40,40,40) end)
end


CreateHeader("Background", 1)
CreateColorPicker("BG Color", Color3.fromRGB(35, 35, 35), function(col) Viewport.BackgroundColor3 = col end, 2)

CreateHeader("Resize Parts", 5)
local PartSelectFrame = Instance.new("Frame")
PartSelectFrame.Size = UDim2.new(0.9, 0, 0, 25)
PartSelectFrame.BackgroundTransparency = 1
PartSelectFrame.LayoutOrder = 6
PartSelectFrame.Parent = SettingsFrame
local UIList = Instance.new("UIListLayout") UIList.Parent = PartSelectFrame UIList.FillDirection = Enum.FillDirection.Horizontal UIList.Padding = UDim.new(0,2)

local PartsBtns = {}
local PartRef = {} 
local function SelectPart(pName)
	Config.CurrentSelectedPart = pName
	for name, btn in pairs(PartsBtns) do
		btn.BackgroundColor3 = (name == pName) and Color3.fromRGB(0, 140, 255) or Color3.fromRGB(50,50,50)
	end
	if PartRef.Update then PartRef.Update(Config.Scales[pName]) end
end

for _, pName in pairs({"Head", "Torso", "Arms", "Legs", "Accessories"}) do
	local b = Instance.new("TextButton")
	b.Name = pName
	b.Size = UDim2.new(0.19, 0, 1, 0)
	b.Text = (pName == "Accessories") and "Acc" or pName
	b.TextSize = 9
	b.TextColor3 = Color3.new(1,1,1)
	b.BackgroundColor3 = Color3.fromRGB(50,50,50)
	b.Parent = PartSelectFrame
	Instance.new("UICorner", b).Parent = b
	b.MouseButton1Click:Connect(function() SelectPart(pName) end)
	PartsBtns[pName] = b
end
SelectPart("Head")

CreateSlider("Multiplier", 0.5, 3, 1, function(v)
	Config.Scales[Config.CurrentSelectedPart] = v
end, PartRef, 7)

CreateHeader("Appearance", 8)
CreateToggle("Paint All (Solid Color)", false, function() Config.SolidColorEnabled = not Config.SolidColorEnabled return Config.SolidColorEnabled end, 9)
CreateColorPicker("Paint Color", Color3.fromRGB(255, 255, 255), function(col) Config.SolidColor = col end, 10)

CreateToggle("ForceField Effect", false, function() Config.IsForceField = not Config.IsForceField return Config.IsForceField end, 13)
CreateColorPicker("Effect Color", Color3.fromRGB(100, 255, 100), function(col) Config.EffectColor = col end, 14)

CreateSlider("Transparency", 0, 1, 0, function(v) Config.Transparency = v end, nil, 15)

CreateHeader("Hide Parts", 16)
local HideFrame = Instance.new("Frame")
HideFrame.Size = UDim2.new(0.9,0,0,85) 
HideFrame.BackgroundTransparency=1 
HideFrame.LayoutOrder = 17 
HideFrame.Parent=SettingsFrame
local HGrid = Instance.new("UIGridLayout") HGrid.Parent=HideFrame HGrid.CellSize=UDim2.new(0.48,0,0,25) HGrid.CellPadding=UDim2.new(0,5,0,5)

local function MiniTog(txt, fn) 
	local b=Instance.new("TextButton") b.Text=txt b.BackgroundColor3=Color3.fromRGB(40,40,40) b.TextColor3=Color3.new(1,1,1) b.TextSize=10 b.Parent=HideFrame 
	Instance.new("UICorner",b).CornerRadius=UDim.new(0,4)
	b.MouseButton1Click:Connect(function() local s=fn() b.BackgroundColor3=s and Color3.fromRGB(150,0,0) or Color3.fromRGB(40,40,40) end)
end
MiniTog("Hide Head", function() Config.Hidden.Head = not Config.Hidden.Head return Config.Hidden.Head end)
MiniTog("Hide Body", function() Config.Hidden.Torso = not Config.Hidden.Torso return Config.Hidden.Torso end)
MiniTog("Hide Arms", function() Config.Hidden.Arms = not Config.Hidden.Arms return Config.Hidden.Arms end)
MiniTog("Hide Legs", function() Config.Hidden.Legs = not Config.Hidden.Legs return Config.Hidden.Legs end)
MiniTog("Hide Acc.", function() Config.Hidden.Acc = not Config.Hidden.Acc return Config.Hidden.Acc end)

CreateHeader("Camera & Rotate", 18)
CreateToggle("Auto Rotate", true, function() Config.AutoRotate = not Config.AutoRotate return Config.AutoRotate end, 19)
CreateSlider("Rot Speed", 0, 0.1, 0.01, function(v) Config.RotSpeed = v end, nil, 20)
CreateSlider("Cam Height", -3, 3, -0.5, function(v) Config.CamHeight = v end, nil, 21)


local CloneCharacter = nil
local RealCharacter = nil
local CurrentRotX, CurrentRotY = 0, 0
local ZoomDistance = 6

local function SetupCharacter()
	WorldModel:ClearAllChildren()
	RealCharacter = Player.Character or Player.CharacterAdded:Wait()
	if not RealCharacter:FindFirstChild("HumanoidRootPart") then 
		task.wait(0.1)
		if not RealCharacter:FindFirstChild("HumanoidRootPart") then return end
	end
	
	RealCharacter.Archivable = true
	CloneCharacter = RealCharacter:Clone()
	
	for _, part in pairs(CloneCharacter:GetDescendants()) do
		if part:IsA("BasePart") then 
			part.Anchored = true 
			part.CanCollide = false 
		end
		if part:IsA("Script") or part:IsA("LocalScript") or part:IsA("Sound") then part:Destroy() end
	end
	
	CloneCharacter:SetPrimaryPartCFrame(CFrame.new(0,0,0))
	local Light = Instance.new("PointLight") 
	Light.Brightness = 2 Light.Range = 15 
	if CloneCharacter:FindFirstChild("HumanoidRootPart") then Light.Parent = CloneCharacter.HumanoidRootPart end
	CloneCharacter.Parent = WorldModel
end

task.wait(0.5) SetupCharacter()
Player.CharacterAdded:Connect(function(newChar)
	RealCharacter = newChar
	task.wait(1) 
	SetupCharacter()
end)

local isInteracting = false

RunService.RenderStepped:Connect(function()
	if not CloneCharacter or not CloneCharacter.Parent or not RealCharacter or not RealCharacter.Parent then return end
	local RealRoot = RealCharacter:FindFirstChild("HumanoidRootPart")
	local CloneRoot = CloneCharacter:FindFirstChild("HumanoidRootPart")
	if not RealRoot or not CloneRoot then return end
	
	CloneRoot.CFrame = CFrame.new(0, 0, 0)
	local activePaint = Config.SolidColorEnabled
	local activeEffect = Config.IsForceField

	for _, realPart in pairs(RealCharacter:GetDescendants()) do
		if realPart:IsA("BasePart") an

Features & Information

You can view, move, and edit your 3D character. This project is open source. I hope someone will develop this script further. I've laid the foundation; someone needs to improve this project.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts