WindShake
by boatbomber
I wanted to have massive forests full of moving leaves. Not for any project of mine, I just wanted to make it cuz it sounded like fun. So I did. And now you guys can have it!
This module handles 77,750 leaf meshes while the game runs at over 220 FPS on my machine. It’s pretty darn fast, all things considered. This is made possible by BulkMoveTo and a optimized version of @Quenty’s incredible octree module.
Note: the wind lines in this demo are a separate module, not related to the shake effect. The lines are open sourced as well in the uncopylocked place below!
Here’s some examples of people using this module!
by @DevForHire
by @BIackoutDev
by @DevForHire
Source:
GitHub:
Library:
Uncopylocked Demo:
API:
Read the API
Properties
number WindShake.UpdateHz
Sets the frequency of the object update stepper. Default 1/45
number WindShake.ComputeHz
Sets the frequency of the object compute stepper. Default 1/30
number WindShake.Radius
Sets the radius for active objects in studs. Default 120
Functions
function WindShake:Init()
Initializes the wind shake logic and adds shake to all tagged objects
Returns:
void
function WindShake:Cleanup()
Halts and clears the wind shake logic and all object shakes
Returns:
void
function WindShake:Pause()
Halts the wind shake logic without clearing
Returns:
void
function WindShake:Resume()
Restarts the wind shake logic without clearing
Returns:
void
function WindShake:AddObjectShake(Object, Settings)
Adds an object to be shaken
Parameters:
-
Object
[BasePart]
The Object to apply shaking to -
Settings
[Optional Dictionary]
The settings to apply to this object’s shake (See below for Settings structure)
Returns:
void
function WindShake:RemoveObjectShake(Object)
Removes shake from an object
Parameters:
-
Object
[BasePart]
The Object to remove shaking from
Returns:
void
function WindShake:SetDefaultSettings(Settings) [DEPRECATED]
Deprecated in favor of setting the Attributes of the WindShake modulescript
Sets the default settings for future object shake additions
Parameters:
-
Settings
[Dictionary]
The settings to use as default (See below for Settings structure)
Returns:
void
function WindShake:UpdateObjectSettings(Object, Settings) [DEPRECATED]
Deprecated in favor of setting the Attributes of the Object
Updates the shake settings of an object already added
Parameters:
-
Object
[BasePart]
The Object to apply shake settings to -
Settings
[Dictionary]
The settings to apply to this object’s shake (See below for Settings structure)
Returns:
void
function WindShake:UpdateAllObjectSettings(Settings)
Updates the shake settings of all active shakes
Parameters:
-
Settings
[Dictionary]
The settings to apply to all objects’ shake (See below for Settings structure)
Returns:
void
Settings
Events
RBXScriptSignal WindShake.ObjectShakeAdded(Object)
Fires when an object is added to WindShake
Parameters:
-
Object
[BasePart]
The object that was added
RBXScriptSignal WindShake.ObjectShakeRemoved(Object)
Fires when an object is removed from WindShake
Parameters:
-
Object
[BasePart]
The object that was removed
RBXScriptSignal WindShake.ObjectShakeUpdated(Object)
Fires when an object’s settings are updated through the update APIs
Parameters:
-
Object
[BasePart]
The object that had its settings updated
RBXScriptSignal WindShake.Resumed()
Fires when WindShake begins shaking the objects
RBXScriptSignal WindShake.Paused()
Fires when WindShake stops shaking the objects
Types
`Settings` tables are structured like so:
{
WindDirection: Vector3 to shake towards (Initially 0.5,0,0.5)
WindSpeed: Positive number that defines how fast to shake (Initially 20)
WindPower: Positive number that defines how much to shake (Initially 0.5)
--If one of these is not defined, it will use default for that one,
--so you can pass a table with just one or two settings and the rest
--will be default so you don't need to make the full table every time.
}
Usage Example:
local WIND_DIRECTION = Vector3.new(1,0,0.3)
local WIND_SPEED = 25
local WIND_POWER = 0.4
local WindShake = require(script.WindShake)
WindShake:SetDefaultSettings({
WindSpeed = WIND_SPEED;
WindDirection = WIND_DIRECTION;
WindPower = WIND_POWER;
})
WindShake:Init() -- Anything with the WindShake tag will now shake
WindShake Editor Plugin
No programming needed, no tag editor plugins, no more manual attribute creation. No more pressing play to see what a tweaked value looks like.
Everything WindShake, made simple.
Features:
-
Import
Don’t know any programming, but want WindShake running in your game? Import brings in the latest WindShake module and a script that’ll get it up and running right away. One click is all it takes. -
Preview
Having to playtest your game just to see what WindPower value looks best is… annoying. Preview fixes that by allowing you to see your models shaking in a ViewportFrame! Rather than naively displaying only your selected leaves, it brings in the entire model so you get to see your leaves relative to the trunk and branches. It also has a direction display in the corner to keep you oriented. -
Simplified Tools
CollectionService tags that aren’t viewable without special plugins? Attributes that need to be manually created by you? No more! The plugin handles all that stuff internally, and exposes it in a familiar “properties” style that’ll get you working quickly and easily.
Get this plugin here!
Enjoying my work? I love to create and share with the community, for free.
I make loads of free and open source scripts and modules for you all to use in your projects!
You can find a lot of them listed for you in my portfolio. Enjoy!
If you’d like to help fund my work, check out my Patreon or BuyMeACoffee!