Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Third person camera doesn't work when respawn?

Hi, I'm writing a third person camera for my game and I was writing the code so that when you die the camera resets. When I test it though and I reset, that doesn't work and I'm stuck in a certain place and not following the player as I want it to.

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 = game.Players.LocalPlayer.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()
    FakeCamera = Instance.new("Part",Camera)
    FakeCamera.CanCollide = false
    FakeCamera.Anchored = true

    while wait() 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, .1)
			XCamOffSet = -3
			ZCamOffSet = 4
		elseif (Right) then
			Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .1)
			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)

Character.Humanoid.Died:Connect(function()
	DiedEvent:FireServer()
	
	runCamera()
end)

game.Players.PlayerAdded:connect(function(plyr) --When there is a player
	plyr.CharacterAdded:connect(function(char) --And a players character
		print("Running Camera")
		runCamera()
	end)
end)

runCamera()

1 answer

✓ Accepted answer

Things I changed:

  • don't run the code when character dies

  • set Character when character respawns

  • Stop the while loop when character no longer exists

  • run code when character spawns

  • fix how it is called at bottom of script

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

local Player = game.Players.LocalPlayer
local 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 = plr.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, .1)
            XCamOffSet = -3
            ZCamOffSet = 4
        elseif (Right) then
            Camera:Interpolate(m,m + Character.HumanoidRootPart.CFrame.lookVector, .1)
            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)

Character.Humanoid.Died:Connect(function()
    DiedEvent:FireServer()
end)


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

3 comments

0

It works fine but you code was kinda sloppy and there were some mistakes. Anyway thank you :D

0

@sen_trix sorry, im multitasking with an assignment for school lol

0

oh ok lol

This discussion is preserved as it was. New answers, comments, and votes are closed.