Hello everyone!
How would i go on about making it so a player falling does not accelerate, but instead falls at a constant speed?
All ideas are appreciated!
Hello everyone!
How would i go on about making it so a player falling does not accelerate, but instead falls at a constant speed?
All ideas are appreciated!
You can check the character’s velocity and keep changing it to the velocity you want.
I’m not very experienced with Physics modifier instances, but maybe you could use a VectorForce with an equal acceleration to that of the workspace.Gravity property and then add a LinearVelocity to move it down on the HumanoidRootPart?
in the game configuration you can easily modify it or else you could use vector force
This would merely make me fall slower, but in the end the character still accelerates. If i were to add a force to the player to counteract acceleration it would have to be squared just like acceleration is
What do you mean? Force is mass * acceleration. Force is just acceleration relative to mass. So for example, applying the same force to a larger object would still accelerate it, just at a slower rate.
Gravity in and of itself is a force. If you simply use a force of, for example, 9.81 upwards (0, 9.81), it should in theory cancel out gravity.
Then, to make the player fall at a constant rate, (i.e. velocity) you can use a LinearVelocity. Although, you will need to set up Attachments which can be particularly annoyed to use
Well it would then only be 9.81 upward for the first second of the fall, and 19.6 for the next second and so on
-- StarterCharacterScripts
local maxSpeed = -30 -- Velocity
local HumanoidRootPart = script.Parent.HumanoidRootPart
local Humanoid = script.Parent:FindFirstChildOfClass("Humanoid")
local Run = game:GetService("RunService")
local freefall = false
Humanoid.StateChanged:Connect(function(old, new)
if new == Enum.HumanoidStateType.Freefall then
freefall = true
print(freefall)
else
freefall = false
print(freefall)
end
end)
Run.RenderStepped:Connect(function()
if freefall == true then
local Velocity = HumanoidRootPart.Velocity
if Velocity.Y < maxSpeed then
HumanoidRootPart.Velocity = Vector3.new(Velocity.X, math.max(maxSpeed, Velocity.Y), Velocity.Z)
end
end
end)
That’s velocity. Velocity does not increase on its own over time.
Force (i.e. acceleration) increases the velocity over a certain period of time. F = m * (v-u)/t
I mean, gravity is a force. How can apply an equal and identical force against the other NOT result in an acceleration of 0?
(Keep in mind, you will need to account for the Player’s mass in the force as force is not just acceleration, but rather mass * acceleration)
Zero gravity script:
local Character = script.Parent
local mass = 0
for i,v in ipairs(Character:GetDescendants()) do
if v:IsA("BasePart") then
mass = mass + v:GetMass()
end
end
local f = Instance.new("VectorForce")
f.Force = Vector3.new(0, mass*workspace.Gravity, 0)
f.Attachment0 = Character.PrimaryPart.RootRigAttachment
f.Parent = Character.PrimaryPart
Now change the velocity of the HumanoidRootPart when Humanoid.FreeFalling is true/false
This physically would not work. If anything it would be BAD for the character.
I have a solution. You can create “local gravity” for the player and anything it has network ownership of if you set gravity to zero locally, and then use your OWN method of gravity. I would use LinearVelocities. They accelerate to a specific speed, and then stop when you reach that velocity.
local plr = game.Players.LocalPlayer
local char = plr.Character or plr.CharacterAdded:Wait()
local local_gravity = 15
game.Workspace.Gravity = 0 -- this will make you float but everything else will still have gravity
local attachment = Instance.new("Attachment", char:WaitForChild("HumanoidRootPart"))
local gravity = Instance.new("LinearVelocity", char.HumanoidRootPart)
gravity.Attachment0 = attachment
gravity.VelocityConstraint = Enum.VelocityConstraintMode.Line
gravity.LineDirection = Vector3.new(0, -1, 0) -- downwards vector unit
gravity.LineVelocity = local_gravity -- the force
-- this is all local!
It’s not tested, but I’m sure it will work. You can change the gravity constant to what’d you like. If you want to stop the gravity, disable the LinearVelocity.
This would not work either for the same reason. It’s way easier to use a Linear Velocity, because it attempts to maintain a certain velocity. You can change the speed.
(Sorry to be picky in advance, but)
Please refer to this post, the Velocity
property is now deprecated
BasePart.Velocity
andBasePart.RotVelocity
are now deprecated (hidden from Properties window). There were multiple issues in their operation when dealing with a part and its assembly. For example, setting velocity on a part that isn’t a root part just doesn’t work, but it always reads the velocity of the specific part. TheAssemblyLinearVelocity
andAssemblyAngularVelocity
properties, along with the new impulse functions, should provide all of the options necessary for setting specific velocities.
cc @Den_vers
Consider the version of the code above with Instance.new called with parent argument:
local wall = Instance.new("Part", workspace.Effects)
wall.Size = Vector3.new(10, 10, 1)
wall.CFrame = CFrame.new(x, y, z)
You may think that this is faster because you saved one assignment, but it’s actually much slower in this case. Here’s what happens:
- You create a Part with the CFrame of 0,0,0 and a default Size, and parent it to workspace.
- ROBLOX sets up property change listeners for replication, rendering, etc.
- ROBLOX queues a replication of a new instance with default values for the Size/CFrame
- ROBLOX updates physics contacts between this part and whatever is at the origin
- You set the part Size to 10,10,1
- ROBLOX queues a replication change for the Size
- ROBLOX updates physics contacts between this part and whatever is at the origin and overlaps with the part given the new dimensions
- You set the part CFrame to x,y,z
- ROBLOX queues a replication change for the CFrame
- ROBLOX updates physics contacts between this part and whatever is at the position x,y,z given the size 10,10,1
Try not to use any bad practices when you can please
This works, and it also makes a lot of sense why. Thank’s alot
As stated by @JackscarIitt Velocity
is deprecated, I will try improve the script in a little bit to ensure Velocity
isn’t used.
I did what @majdTRM said basically and it works fairly well.
Inside of StarterCharacterScripts:
local Character = script.Parent
local mass = 0
for i,v in ipairs(Character:GetDescendants()) do
if v:IsA("BasePart") then
mass = mass + v:GetMass()
end
end
local f = Instance.new("VectorForce")
f.Force = Vector3.new(0, mass*workspace.Gravity, 0)
f.Attachment0 = Character.PrimaryPart.RootRigAttachment
f.Parent = Character.PrimaryPart
local lv = Instance.new("LinearVelocity")
lv.LineDirection = Vector3.new(0, 1, 0)
lv.LineVelocity = -10
lv.VelocityConstraintMode = Enum.VelocityConstraintMode.Line
lv.MaxForce = 10^4
lv.Enabled = false
lv.Attachment0 = Character.PrimaryPart.RootRigAttachment
lv.Parent = Character.PrimaryPart
Character.Humanoid.FreeFalling:Connect(function(bool)
lv.Enabled = bool
end)
Test place:
Baseplate.rbxl (40.9 KB)
It’s all good i can do that, thank’s alot again
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.