What I’m trying to achieve is a Camera FOV Zoom In & Out like in FOV Shooter games where you scroll the mouse wheel back and fourth to aim for your target.
Although the Tweens & Camera Mode settings function, it continues to do so whenever you unequip a tool and it’s the error/bug bothering me right now. I have tried :Disconnect() and it works perfectly fine until you equip it a 2nd time only for it to disfunction.
Here is the script I used:
--//Service Variables\\--
local TweenService = game:GetService("TweenService")
--//Zooming & First Person Functions\\--
local function ZoomIn()
local FOV_ZoomIn = TweenService:Create(Camera, TweenInfo.new(), {FieldOfView = 35})
Player.CameraMode = Enum.CameraMode.LockFirstPerson
FOV_ZoomIn:Play()
end
local function ZoomOut()
local FOV_ZoomOut = TweenService:Create(Camera, TweenInfo.new(), {FieldOfView = 70})
Player.CameraMode = Enum.CameraMode.Classic
FOV_ZoomOut:Play()
end
--///Tool Variables\\--
local Tool = script.Parent
--//Tool Main Functions\\--
Tool.Equipped:Connect(function(Mouse)
Mouse.Button2Down:Connect(ZoomIn)
Mouse.Button2Up:Connect(ZoomOut)
Tool.Unequipped:Connect(function()
ZoomOut()
end)
end)
That is because you aren’t actually cancelling the connections, but instead just “zooming out” whenever the tool is unequipped. I also recommend you take the Unequipped listener out of the Equipped function as it creates multiple listeners for no reason. Here is how I would write it:
-- Services --
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
-- Variables --
local Tool = script.Parent
local Player = Players.LocalPlayer
local CurrentCamera = workspace.CurrentCamera
local DownConnection
local UpConnection
local CameraTween = nil
-- Functions --
local function ZoomIn()
if CameraTween then
CameraTween:Cancel()
CameraTween = nil
end
CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 35})
Player.CameraMode = Enum.CameraMode.LockFirstPerson
CameraTween:Play()
end
local function ZoomOut()
if CameraTween then
CameraTween:Cancel()
CameraTween = nil
end
CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 70})
Player.CameraMode = Enum.CameraMode.Classic
CameraTween:Play()
end
-- Scripting --
Tool.Equipped:Connect(function()
DownConnection = Tool.Activated:Connect(ZoomIn)
UpConnection = Tool.Deactivated:Connect(ZoomOut)
end)
Tool.Unequipped:Connect(function()
DownConnection:Disconnect()
UpConnection:Disconnect()
ZoomOut()
end)
If you really want the Unequipped listener to be inside the Equipped listener, then make sure you disconnect it. You can do it like this:
-- Services --
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
-- Variables --
local Tool = script.Parent
local Player = Players.LocalPlayer
local CurrentCamera = workspace.CurrentCamera
local CameraTween = nil
-- Functions --
local function ZoomIn()
if CameraTween then
CameraTween:Cancel()
CameraTween = nil
end
CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 35})
Player.CameraMode = Enum.CameraMode.LockFirstPerson
CameraTween:Play()
end
local function ZoomOut()
if CameraTween then
CameraTween:Cancel()
CameraTween = nil
end
CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 70})
Player.CameraMode = Enum.CameraMode.Classic
CameraTween:Play()
end
-- Scripting --
Tool.Equipped:Connect(function()
local DownConnection = Tool.Activated:Connect(ZoomIn)
local UpConnection = Tool.Deactivated:Connect(ZoomOut)
local UnequippedListener = nil
UnequippedListener = Tool.Unequipped:Connect(function()
DownConnection:Disconnect()
UpConnection:Disconnect()
UnequippedListener:Disconnect()
ZoomOut()
end)
end)