Hi, I'm writing a game that requires a third-person camera. My main goal when writing this camera script is to make it as smooth as possible. The problem I have is that I want it to lock onto my mouse (just like shift-lock) but smoothly.

Code:

repeat wait() until game.Players.LocalPlayer.Character

-- Settings
local XCamOffSet = 2
local YCamOffSet = 2
local ZCamOffSet = 4

local Player = game.Players.LocalPlayer
local Character = Player.Character

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Camera = game.Workspace.CurrentCamera

local DiedEvent = game.ReplicatedStorage.RemoteEvents.DiedEvent

local FakeCamera = nil
local Forward = false
local Backwards = false
local Left = false
local Right = false

function runCamera()
    Character = Player.Character
    FakeCamera = Instance.new("Part",Camera)
    FakeCamera.CanCollide = false
    FakeCamera.Anchored = true

    while wait() and Character.Parent do
        local m = Character.HumanoidRootPart.CFrame * CFrame.new(XCamOffSet, YCamOffSet, ZCamOffSet)

        Camera.CameraType = Enum.CameraType.Scriptable

        if (Forward) then
            Camera:Interpolate(m, m + Character.HumanoidRootPart.CFrame.lookVector, .1)
            ZCamOffSet = 4
            XCamOffSet = 2
        elseif (Backwards) then
            Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .1)
            ZCamOffSet = -5
            XCamOffSet = 2
        elseif (Left) then
            Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .05)
            XCamOffSet = -3
            ZCamOffSet = 4
        elseif (Right) then
            Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .05)
            XCamOffSet = 3
            ZCamOffSet = 4
        else
            Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .05)
            ZCamOffSet = 4
            XCamOffSet = 2
        end
    end
end

UserInputService.InputBegan:Connect(function(keyCode)
    if keyCode.keyCode == Enum.KeyCode.W then
        Forward = true
    elseif keyCode.keyCode == Enum.KeyCode.S then
        Backwards = true
    elseif keyCode.keyCode == Enum.KeyCode.A then
        Left = true
    elseif keyCode.keyCode == Enum.KeyCode.D then
        Right = true
    end
end)

UserInputService.InputEnded:Connect(function(keyCode)
    if keyCode.keyCode == Enum.KeyCode.W then
        Forward = false
    elseif keyCode.keyCode == Enum.KeyCode.S then
        Backwards = false
    elseif keyCode.keyCode == Enum.KeyCode.A then
        Left = false
    elseif keyCode.keyCode == Enum.KeyCode.D then
        Right = false
    end
end)


Player.CharacterAdded:Connect(runCamera)
if Player.Character then runCamera() end

1 comment