I'm working on another third person camera, but this time I'm using ROBLOX's default player. I got it working great, but I want to force the player to strafe, rather than turn left or right. Lock first person didn't work, (I'm using lock center to make the mouse stay centered) I haven't been able to find any info on how to force the player to strafe, other than using first person.
Does anyone know how I would do this?
My code:
--Third person camera stuff-- repeat wait() until game.Workspace:FindFirstChild(game.Players.LocalPlayer.Name) --Set up-- ip = game:GetService("UserInputService") cam = game.Workspace.CurrentCamera plr = game.Players.LocalPlayer.Character plr.Humanoid.AutoRotate = false --This would be an example of forced settings, though I made a GUI settings example. --[[ msense = 10 --Might want to make a user controllable value. I personally prefer 10x but I'm also a very fast paced gamer. msmooth = 35 --How much is the mouse.Delta divided by? zoomMax = 80 --The highest the camera can me rotated on the y axis, so you can't glitch it. 85 is exavtly 180 degrees. ]]-- --Coroutines-- camCnt = coroutine.wrap(function() cam.CameraType = Enum.CameraType.Scriptable cam.CoordinateFrame = CFrame.new(plr.Torso.Position+Vector3.new(2,2,3)) ip.MouseBehavior = Enum.MouseBehavior.LockCenter game.Players.LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson local angleX = 0 local angleY = 0 ip.InputChanged:connect(function(inputObject) if inputObject.UserInputType == Enum.UserInputType.MouseMovement then if inputObject.Delta.x < 0 then angleX = angleX - (1 - inputObject.Delta.x/msmooth) * msense elseif inputObject.Delta.x > 0 then angleX = angleX + (1 + inputObject.Delta.x/msmooth) * msense end if inputObject.Delta.y < 0 then angleY = angleY - (1 - inputObject.Delta.y/msmooth) * msense elseif inputObject.Delta.y > 0 then angleY = angleY + (1 + inputObject.Delta.y/msmooth) * msense end end end) game:GetService("RunService").RenderStepped:connect(function() if angleY > zoomMax then angleY = zoomMax elseif angleY < -zoomMax then angleY = -zoomMax end local x = 5 * math.cos(math.rad(angleX)) local z = 5 * math.sin(math.rad(angleX)) local y = 2.5 * math.tan(math.rad(angleY)) local camPosition = Vector3.new(x, y, z) camPosition = camPosition + plr.Torso.Position cam.CoordinateFrame = CFrame.new(camPosition, plr.Torso.Position)*CFrame.new(2,2,3) end) end) --run-- game.Players.LocalPlayer.Character.Humanoid.Died:connect(function() cam.CameraType = Enum.CameraType.Custom game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic end) script.Parent.Settings.TextButton.MouseButton1Click:connect(function() msense = math.floor(script.Parent.Settings.msense.CanvasPosition.X/112.5) msmooth = math.floor(script.Parent.Settings.smooth.CanvasPosition.X/31.5) zoomMax = 80 camCnt() for i,c in pairs (script.Parent.Settings:GetChildren()) do c.Visible = false end end)
Update:
I got some code that sort-of works, but is still inefficient, I would love if I got a better math equation for this.
--Third person camera stuff-- repeat wait() until game.Workspace:FindFirstChild(game.Players.LocalPlayer.Name) --Set up-- ip = game:GetService("UserInputService") cam = game.Workspace.CurrentCamera plr = game.Players.LocalPlayer.Character plr.Humanoid.AutoRotate = false m = game.Players.LocalPlayer:GetMouse() --This would be an example of forced settings, though I made a GUI settings example. --[[ msense = 10 --Might want to make a user controllable value. I personally prefer 10x but I'm also a very fast paced gamer. msmooth = 35 --How much is the mouse.Delta divided by? zoomMax = 80 --The highest the camera can me rotated on the y axis, so you can't glitch it. 85 is exavtly 180 degrees. ]]-- --Coroutines-- camCnt = coroutine.wrap(function() cam.CameraType = Enum.CameraType.Scriptable cam.CoordinateFrame = CFrame.new(plr.Torso.Position+Vector3.new(2,2,3)) ip.MouseBehavior = Enum.MouseBehavior.LockCenter game.Players.LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson local angleX = 0 local angleY = 0 ip.InputChanged:connect(function(inputObject) if inputObject.UserInputType == Enum.UserInputType.MouseMovement then if inputObject.Delta.x < 0 then angleX = angleX - (1 - inputObject.Delta.x/msmooth) * msense elseif inputObject.Delta.x > 0 then angleX = angleX + (1 + inputObject.Delta.x/msmooth) * msense end if inputObject.Delta.y < 0 then angleY = angleY - (1 - inputObject.Delta.y/msmooth) * msense elseif inputObject.Delta.y > 0 then angleY = angleY + (1 + inputObject.Delta.y/msmooth) * msense end end end) game:GetService("RunService").RenderStepped:connect(function() if angleY > zoomMax then angleY = zoomMax elseif angleY < -zoomMax then angleY = -zoomMax end local dir = Vector3.new(m.hit.p.x,0,m.hit.p.z) local x = 5 * math.cos(math.rad(angleX)) local z = 5 * math.sin(math.rad(angleX)) local y = 2.5 * math.tan(math.rad(angleY)) local camPosition = Vector3.new(x, y, z) camPosition = camPosition + plr.Torso.Position cam.CoordinateFrame = CFrame.new(camPosition, plr.Torso.Position)*CFrame.new(2,2,3) plr.Torso.CFrame = CFrame.new(plr.Torso.CFrame.p,dir) end) end) --run-- game.Players.LocalPlayer.Character.Humanoid.Died:connect(function() cam.CameraType = Enum.CameraType.Custom game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic end) script.Parent.Settings.TextButton.MouseButton1Click:connect(function() msense = math.floor(script.Parent.Settings.msense.CanvasPosition.X/112.5) msmooth = math.floor(script.Parent.Settings.smooth.CanvasPosition.X/31.5) zoomMax = 80 camCnt() for i,c in pairs (script.Parent.Settings:GetChildren()) do c.Visible = false end end)