So I’m using a lerp to make my bullet have a curved flight. Here is the code
local NewBezier = Bezier.new(p0, p2, p1)
for t = 0,1,0.0165 do--0.0165
local position = NewBezier:CalculatePositionAt(t)
local derivative = NewBezier:CalculateDerivativeAt(t)
TweenService:Create(bullet, TweenInfo.new(task.wait()), {CFrame = CFrame.new(position, position + derivative)}):Play()
bullet.CFrame = CFrame.new(position, position + derivative)
end
Currently, the bullet will fly faster for slower for shorter shots. The problem: I want the bullet to go at the same speed no matter how far/close the shot was.
Any replies are appreciated. Thank you!
edit: I relized there was something that I didn’t mean to put in the code but it’s fixed now.
To get a constant time, you need to have the distance and speed unit that you want the bullet to travel.
Using code that would look like this:
local distance = (bullet.Position - yourFinalPosition).Magnitude
speed = 300
local time = (distance/speed)
Where distance is the difference between your origin position and end position.
You also don’t really need a module to have a curved flight path. There is a projectile motion equation you can use that makes it very simple to model.
local TIME_TO_DESTINATION = 0.5
local gravityVector = Vector3.new(0, -workspace.Gravity, 0)
--calculating the velocity needed to reach the destination
local velocityForDestination = (destinationPosition - originPosition - (gravityVector * TIME_TO_DESTINATION^2)/2)/TIME_TO_DESTINATION
--Air travel using Cframe
local airTime = 0
local connection = nil
connection = RunService.Heartbeat:Connect(function(dt)
if airTime < TIME_TO_DESTINATION then
bullet.CFrame = CFrame.new(originPosition + velocityForDestination * airTime + gravityVector * airTime^2 / 2)
airTime = airTime + dt
else
connection:Disconnect()
end
end)