How to make a third person camera on equip

Hi there,

I’m looking for some help with my gun camera script! I am trying to make it so when the player equips the tool it will go into the camera mode. Don’t worry about helping with making it zoom (I Got that to work!)

I believe I should change the function (the one I commented ‘Change this’ on) to the on equipped function but then I would lose Character
This is my script (A child of the tool)

 local Players = game:GetService("Players")
        local ContextActionService = game:GetService("ContextActionService")
        local UserInputService = game:GetService("UserInputService")
        local RunService = game:GetService("RunService")
     
    local camera = workspace.CurrentCamera
    local cameraOffset = Vector3.new(2, 2, 8)
    local player = Players.LocalPlayer
     
    player.CharacterAdded:Connect(function(character) -- Change this???--
     
    	local humanoid = character:WaitForChild("Humanoid")
    	local rootPart = character:WaitForChild("HumanoidRootPart")
    	humanoid.AutoRotate = false
     
    	local cameraAngleX = 0
    	local cameraAngleY = 0
     
    	local function playerInput(actionName, inputState, inputObject)
    		-- Calculate camera/player rotation on input change
    		if inputState == Enum.UserInputState.Change then
    			cameraAngleX = cameraAngleX - inputObject.Delta.X
    			-- Reduce vertical mouse/touch sensitivity and clamp vertical axis
    			cameraAngleY = math.clamp(cameraAngleY-inputObject.Delta.Y*0.4, -75, 75)
    			-- Rotate root part CFrame by X delta
    			rootPart.CFrame = rootPart.CFrame * CFrame.Angles(0, math.rad(-inputObject.Delta.X), 0)
    		end
    	end
    	ContextActionService:BindAction("PlayerInput", playerInput, false, Enum.UserInputType.MouseMovement, Enum.UserInputType.Touch)
     
    	RunService.RenderStepped:Connect(function()
    		if camera.CameraType ~= Enum.CameraType.Scriptable then
    			camera.CameraType = Enum.CameraType.Scriptable
    		end
    		local startCFrame = CFrame.new((rootPart.CFrame.Position)) * CFrame.Angles(0, math.rad(cameraAngleX), 0) * CFrame.Angles(math.rad(cameraAngleY), 0, 0)
    		local cameraCFrame = startCFrame:ToWorldSpace(CFrame.new(cameraOffset.X, cameraOffset.Y, cameraOffset.Z))
    		local cameraFocus = startCFrame:ToWorldSpace(CFrame.new(cameraOffset.X, cameraOffset.Y, -10000))
    		camera.CFrame = CFrame.new(cameraCFrame.Position, cameraFocus.Position)
    	end)
    end)
     
    local function focusControl(actionName, inputState, inputObject)
    	-- Lock and hide mouse icon on input began
    	if inputState == Enum.UserInputState.Begin then
    		UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
    		UserInputService.MouseIconEnabled = false
    		ContextActionService:UnbindAction("FocusControl", focusControl, false, Enum.UserInputType.MouseButton1, Enum.UserInputType.Touch, Enum.UserInputType.Focus)
    	end
    end
    ContextActionService:BindAction("FocusControl", focusControl, false, Enum.UserInputType.MouseButton1, Enum.UserInputType.Touch, Enum.UserInputType.Focus)

Any help would be much appreciated! :grinning:

2 Likes

You could also use game.Players.LocalPlayer.Character I suppose. I don’t really know what the issue is, it looks alright to me.

Although, note that “CharacterAdded fires when the Character is assigned to the Player , which is before the Character is parented to the Workspace.”

You could do a workspace:WaitForChild(charactername) if you want.

Thank you! This has really helped🤩

1 Like