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

How to return the camera?

I have made a main menu and the camera is in the sky like a cutscene however i do not know how to make it so it returns to the player i will add the camera script if you need it for anything.

repeat wait () until game.Workspace.CurrentCamera ~= nil

local c = game.Workspace.CurrentCamera
local data = LoadLibrary("RbxUtility").DecodeJSON(script.CutsceneData.Value)
local rs = game:GetService("RunService").RenderStepped

function tweenCam(c1,f1,time,fov,roll)
	local c0,f0,fv0,r0,frames = c.CoordinateFrame,c.Focus,c.FieldOfView,c:GetRoll(),time/0.015
	for i = 1,frames do
		c.CameraType = "Scriptable"
		c.CoordinateFrame = CFrame.new(c0.p:lerp(c1.p,i/frames),f0.p:lerp(f1.p,i/frames))
		c.FieldOfView = (fv0+(fov-fv0)*(i*(1/frames)))
		c:SetRoll(r0+(roll-r0)*(i*(1/frames)))
		rs:wait()
	end
end

if script:findFirstChild("SkipCutsceneGuiValue") then
	local gui = script.SkipCutsceneGui:clone()
	gui.Parent = game.Players.LocalPlayer.PlayerGui
	gui.Cutscene.Value = script
	gui.Enter.Debug.Disabled = false
	script.SkipCutsceneGuiValue.Value = gui
end
while true do
	wait()
	c.CameraSubject = nil	
	c.CameraType = "Scriptable"
	c.CoordinateFrame = CFrame.new(unpack(data[1].c1))
	c.Focus = CFrame.new(unpack(data[1].f1))
	c.FieldOfView = data[1].FOV
	c:SetRoll(data[1].Roll)
	for i = 2,#data do
		tweenCam(CFrame.new(unpack(data[i].c1)),CFrame.new(unpack(data[i].f1)),data[i].step,data[i].FOV,data[i].Roll)
	end
end
c.CameraSubject = game.Players.LocalPlayer.Character.Humanoid	
c.CameraType = "Custom"
c.FieldOfView = 70
if script:findFirstChild("SkipCutsceneGuiValue") then
	if script.SkipCutsceneGuiValue.Value ~= nil then
		script.SkipCutsceneGuiValue.Value:Destroy()
	
end   
end    workspace.Script.destory()       
	 

2 answers

From line 25 to line 36, you have an infinite loop. You have to break that loop using break somewhere in your loop's code in order for the code after line 36 to execute.

Another option could be to have a BoolValue object that tells the script whether or not to do the camera work and then add something like this to replace the "while true do" line:

while game.Players.LocalPlayer.BoolValue.Value == true do --Change game.Players.LocalPlayer.BoolValue to the path of your BoolValue.

3 comments

0

ok ill try it

0

messed it up even more by not working

0

Edited my answer.

Loop

I have to leave right now, so I'll come back and put an explanation, but you need a break to get out of that infinite loop.

repeat wait () until game.Workspace.CurrentCamera ~= nil

local c = game.Workspace.CurrentCamera
local data = LoadLibrary("RbxUtility").DecodeJSON(script.CutsceneData.Value)
local rs = game:GetService("RunService").RenderStepped

function tweenCam(c1,f1,time,fov,roll)
    local c0,f0,fv0,r0,frames = c.CoordinateFrame,c.Focus,c.FieldOfView,c:GetRoll(),time/0.015
    for i = 1,frames do
        c.CameraType = "Scriptable"
        c.CoordinateFrame = CFrame.new(c0.p:lerp(c1.p,i/frames),f0.p:lerp(f1.p,i/frames))
        c.FieldOfView = (fv0+(fov-fv0)*(i*(1/frames)))
        c:SetRoll(r0+(roll-r0)*(i*(1/frames)))
        rs:wait()
    end
end

if script:findFirstChild("SkipCutsceneGuiValue") then
    local gui = script.SkipCutsceneGui:clone()
    gui.Parent = game.Players.LocalPlayer.PlayerGui
    gui.Cutscene.Value = script
    gui.Enter.Debug.Disabled = false
    script.SkipCutsceneGuiValue.Value = gui
end
while true do
    wait()
    c.CameraSubject = nil   
    c.CameraType = "Scriptable"
    c.CoordinateFrame = CFrame.new(unpack(data[1].c1))
    c.Focus = CFrame.new(unpack(data[1].f1))
    c.FieldOfView = data[1].FOV
    c:SetRoll(data[1].Roll)
    for i = 2,#data do        tweenCam(CFrame.new(unpack(data[i].c1)),CFrame.new(unpack(data[i].f1)),data[i].step,data[i].FOV,data[i].Roll)
    end
break --<
end
c.CameraSubject = game.Players.LocalPlayer.Character.Humanoid   
c.CameraType = "Custom"
c.FieldOfView = 70
if script:findFirstChild("SkipCutsceneGuiValue") then
    if script.SkipCutsceneGuiValue.Value ~= nil then
        script.SkipCutsceneGuiValue.Value:Destroy()

end   
end    workspace.Script.destory()       


Or rather, you don't need the 'while true do' at all. I'll come back and fully explain it even more.

Quick Link

http://wiki.roblox.com/index.php?title=Loops#Break

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