Inconsistent Camera

Hey, I created a custom first person camera that works about 80% of the time, but sometimes it seems to give weird results

This is what it’s supposed to look like:

This is what it sometimes looks like:

here is my script, any feedback or advice would be great:

local UIS = game:GetService("UserInputService")
local RS = game:GetService("RunService")
local RP = game:GetService("ReplicatedStorage")

local enabled = script.Enabled
local camera = workspace.CurrentCamera
local player = game.Players.LocalPlayer
repeat task.wait() until player.Character
local character = player.Character 
local head = character:WaitForChild("Head")
local hrp = character:WaitForChild("HumanoidRootPart")
local humanoid = character:WaitForChild("Humanoid")
local event = RP:WaitForChild("Remotes").POVToggleEvent
local shaker = require(RP:WaitForChild("Modules").ScreenShaker)
player.CharacterAdded:Connect(function(NewCharacter)
	character = NewCharacter
	head = character:WaitForChild("Head")
	hrp = character:WaitForChild("HumanoidRootPart")
	humanoid = character:WaitForChild("Humanoid")
end)
local transparencyUpdated = false
local isToggled = false
local cameraDirection = Vector2.new()
local sensitivity = 0.3
local canToggle = true
local bindable = RP:WaitForChild("Bindables").GetCameraDirection
local setCamera = RP:WaitForChild("Bindables").SetCameraDirection




local function updateCamera(enabled)
	UIS.MouseIconEnabled = false
	
	if enabled == false then
		camera.CameraType = Enum.CameraType.Custom
		if UIS.MouseBehavior == Enum.MouseBehavior.LockCenter then
			UIS.MouseBehavior = Enum.MouseBehavior.Default
		end
	else
		UIS.MouseBehavior = Enum.MouseBehavior.LockCenter
		camera.CameraType = Enum.CameraType.Scriptable
	end
end


local function setTransparency(transparency)
	if not character or transparencyUpdated == true then return end
	transparencyUpdated = true
	for _,v in pairs(character:GetDescendants()) do
		if v:IsA("Part") and v.Name == "Head" then
			v.LocalTransparencyModifier = 1
		elseif v:IsA("Accessory") then
			local handle = v:FindFirstChild("Handle")

			if handle then
				handle.LocalTransparencyModifier = 1
			end
		end
	end
end




UIS.InputBegan:Connect(function(input, typing)
	if typing then return end
	if input.KeyCode == Enum.KeyCode.R and humanoid.Health ~= 0 and not character:FindFirstChild("CUTSCENE") and RS:IsStudio() then
		if isToggled then --player is in 1st person, leaving 1st person
			event:FireServer("3rdPerson")
			isToggled = false
		else --player is NOT in 1st person, entering 1st person
			hrp.AssemblyLinearVelocity = Vector3.zero
		--	print(character.Torso.Position)
			print("----")
			event:FireServer("1stPerson")
			isToggled = true
		end
	end
end)

RS.RenderStepped:Connect(function(dt)
	if isToggled and humanoid.Health ~= 0 then
		updateCamera(enabled)
		setTransparency((enabled and 1) or 0)
		if enabled == false then return end
		
		cameraDirection -= UIS:GetMouseDelta()*sensitivity
		cameraDirection = Vector2.new(cameraDirection.X%360,math.clamp(cameraDirection.Y,-70,70))
		print(cameraDirection)

		-- Apply shake to camera CFrame

		--print(shaker.OffsetX)
		camera.CFrame = CFrame.new(shaker.OffsetX, shaker.OffsetY, 0) * CFrame.new(character.Torso.Position) * CFrame.new(0,1.4,0.25)*CFrame.fromOrientation(math.rad(cameraDirection.Y), math.rad(cameraDirection.X), 0) * CFrame.new(0,0.5+(-cameraDirection.Y/90*0.5),(-cameraDirection.Y/90*0.5))
		hrp.CFrame = CFrame.new(hrp.CFrame.Position)*CFrame.fromOrientation(0,math.rad(cameraDirection.X),0)
	else
		if UIS.MouseIconEnabled == false then
			UIS.MouseIconEnabled = true
			camera.CameraType = "Custom"
			UIS.MouseBehavior = Enum.MouseBehavior.Default
			transparencyUpdated = false
			for _,v in pairs(character:GetDescendants()) do
				if v:IsA("Part") and v.Name == "Head" then
					v.LocalTransparencyModifier = 0
				elseif v:IsA("Accessory") then
					local handle = v:FindFirstChild("Handle")

					if handle then
						handle.LocalTransparencyModifier = 0
					end
				end
			end
			isToggled = false
		end
	end
end)
1 Like