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)