I’ve been searching this specific topic for so long but I haven’t managed to find any solution at all. So what I’m trying to archive here is to make a wind speed detector for my game. And with that I would apply an effect to it such as shake effect. What I’m trying to do here is making the shake speed so that when the player move at a high speed, the shakes will start to occur. If anyone could explain me how you would do this in a script, it would be nice if you give me some helps. Thanks!
There’s no such thing as “wind speed” in Roblox(as I am aware of). Perhaps you could use the player character velocity:
--LocalScript inside StarterCharacterScripts(if it's only for local visual effects)
local RunService = game:GetService("RunService")
local Character = script.Parent
local Root = Character:WaitForChild("HumanoidRootPart", 5)
if not Root then warn("HumanoidRootPart wasn't found") return end
local connection
connection = RunService.RenderStepped:Connect(function()
if not Root then
connection:Disconnect()
return
end
local velocity = Root.Velocity
--then you can use the velocity x, y, z to detect speed
print(velocity)
end)
The way I would go about doing this. Is if you detect the speed the player is going through a local script then have some arguments determining what happens at what speed
Something on the lines of:
local CameraShaking = false
game.Players.LocalPlayer.CharacterAdded:Connect(function(Char)
while Char do
wait()
local Speed = Char.Humanoid.WalkSpeed
if Speed > 20 then
if WindSound.Playing == false then
WindSound:Play()
end
WindSound.Volume = (Speed-19/10)
else
if WindSound.Playing == true then
WindSound:Stop()
end
end
if Speed > 30 and CameraShaking == false then
CameraShaking = true
CameraEffects()
end
end
end)
WalkSpeed isn’t related to movement, your script will detect how fast a character is able to move instead(for example if they are idle but have a WalkSpeed of 100 your script will misbehave).
For some reason I was thinking the Player would always be moving. But even still there was a lot wrong with the above.
Ignore my previous post
Thanks! I mean yeah you’re right. I shouldn’t have said the wind at all but thank you!
Also I have one question for you. So every object in the game like the part object. Does it has its own velocity to it?
Every BasePart(Part, MeshPart etc.) has it’s own velocity, although If a part is anchored it’s velocity wont change, which means you want to use velocity for physics based movement(such as a player moving) not anchored tweening and such(although if you manually set the velocity of an anchored part it never goes down which can be helpful for stuff like conveyor belts).
I never know this at all since I started developing my project but thank you for that. And also what about the magnitude thing? Some people use it to detect speed movement for their model. I don’t understand how they do that and it’s a bit complicated. First what I’ve seen were they used like a bodythrust(the physic function that controls car’s wheels to move forward) as detecting a speed movement. Then, they implemented it with sound volume of the wind which means if the car’s wheel is spinning faster, the more louder the sound produces. And yeah it’s kinda complicated
Honestly I consider myself unexperienced with physics based scripting, although I think magnitude is used as a fast way to calculate the distance between two objects(perhaps those users use some kind of velocity formula to detect the amount of distance travelled in a small amount of time) and it may be a better solution as it returns a single value, example:
local old = Root.Position
local connection
connection = RunService.RenderStepped:Connect(function()
if not Root then
connection:Disconnect()
return
end
local velocity = (Root.Position-old).Magnitude*100
old = Root.Position
--returns a single value which makes it easier to use(although it will also count situations like free falling)
print(velocity)
end)
After 6 days, I managed to find a working solution:
--LocalScript inside StarterCharacterScripts
local Character = script.Parent
local Root = Character:WaitForChild("HumanoidRootPart", 5)
if not Root then warn("HumanoidRootPart wasn't found") return end
while task.wait() do
if not Root then break end
--get the HumanoidRootPart Velocity
local velocity = Root.Velocity
local total = math.sqrt(velocity.X^2+velocity.Z^2)
--round speed
local speed = math.round(total)
print(speed)
end