I am making a weapons framework for a game, and have just completed the recoil function. It works, but only when the player is standing still. if the player is shooting their gun and moves in any direction, or even just moves their camera, the viewmodel starts glitching around:
I presume this has something to do with the runservice function later down the script, which sets the viewmodel’s primary part to the camera’s cframe on every renderstep. I just dont know how to fix it.
Heres the script:
vmStep = runService.RenderStepped:Connect(function() -- viewmodel to camera CFrame
local mouseDelta = UIS:GetMouseDelta()
if mouseDelta.X > 50 or mouseDelta.X < -50 then
if mouseDelta.X > 50 then
local overshotX = mouseDelta.X - 50
mouseDelta = mouseDelta - Vector2.new(overshotX, 0)
else
local overshotX = mouseDelta.X + 50
mouseDelta = mouseDelta - Vector2.new(overshotX, 0)
end
end
local swayCalc = Vector3.new(-mouseDelta.X / 250, mouseDelta.Y / 100, 0)
viewModel.HumanoidRootPart.CFrame = cam.CFrame
viewModel.HumanoidRootPart.CFrame *= CFrame.new(swayCalc)
end)
The recoil function has a .03 second tweentime for the camera tween, which I will also attach here:
function recoilFunction()
local tI = TweenInfo.new(.03,Enum.EasingStyle.Linear,Enum.EasingDirection.Out,0,false,0)
local toPosCalc = {
CFrame = cam.CFrame * CFrame.Angles(math.rad(recoilX),math.rad(math.random(recoilY1,recoilY2)),math.rad(zRot)) -- x to shake up, y to shake sideways.
}
if zRot > 0 then
zRot = math.random(recoilZ2*-1,recoilZ1*-1)
else
zRot = math.random(recoilZ1,recoilZ2)
end
local tween = tweenService:Create(workspace.CurrentCamera,tI,toPosCalc)
tween:Play()
end
Seems like this is an issue with using tween service on the camera, I wouldn’t recommend using tween service on the camera, its causing the camera to lag behind. You would have to find an alternative way of doing recoil.
Idk if the recoilFunction is constantly running in a loop or only runs when the weapon is fired, however if the recoilFunction is constantly running in like RenderStepped or something that might be a problem. So yeah I gotta agree with Jojo
Also I notice that you use MouseDelta for the VMsway → which means the VM will kinda move because when you rotate your camera, your mouse also move → there will be mouseDelta
mouseDelta can even be calculated or detected even when the mouse is locked
personally, instead of using MouseDelta to calculate the swayCalc, I would prefer to use the difference between of the current camera frame to the last camera frame, so it might look something like:
local lastcamera_CF = CFrame.new()
local swayCalc = CFrame.new()
local CameraSwaySmoothness = 0.25 -- the smaller the smoother and slower, the bigger the faster
local currentswayAMT = -0.2 -- currently negative (i mean you can play around and tweak so you know what it does)
vmStep = runService.RenderStepped:Connect(function() -- viewmodel to camera CFrame
local frame_diff = camera.CFrame:ToObjectSpace(lastcamera_CF)
local X,Y,Z = frame_diff:ToOrientation()
swayCalc = swayCalc:Lerp(CFrame.Angles(math.sin(X) * currentswayAMT, math.sin(Y) * currentswayAMT, 0), CameraSwaySmoothness)
viewModel.HumanoidRootPart.CFrame = cam.CFrame * swayCalc
--save you less line ig?
lastcamera_CF = camera.CFrame
end)
try it and let me know if it works or not . And of course this code is not made by me , I learnt it from another very talented, and big brain developer
The function only runs when the weapon is fired, I have previously tried incasing the function in a renderstep function but it was unoptimized and also threw off all the math in the function
I mean… it kinda works? It just looks really akward, also I have no idea how any of this works so I cant really edit it or integrate it into other things
play around with CameraSwaySmoothness and currentswayAMT you will see how it works
and btw since that thing moving pretty slow, you might want to up the CameraSwaySmoothness value.
Also you might want to change the currentswayAMT from negative to positive since by looking at your video i can tell that they way the VM swaying is inversed