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.RenderDistance
Sets the render distance for active objects in studs. Default 150
number WindShake.MaxRefreshRate
Sets the maximum dynamic refresh rate for active objects in seconds. Default 1/60
Functions
function WindShake:Init(config: {
MatchWorkspaceWind: boolean?,
}?)
Initializes the wind shake logic and adds shake to all tagged objects
Parameters:
-
config
[Optional Dictionary]Configuration for the initialization
-
MatchWorkspaceWind
[Optional Boolean]Whether to match the wind settings to the Workspace’s GlobalWind setting. Default false
-
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
function WindShake:MatchWorkspaceWind()
Sets the wind settings to match the current workspace GlobalWind
When
:Init()
is called with theMatchWorkspaceWind
config set to true, this is called automatically
Returns:
void
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 WindShake = require(script.WindShake)
WindShake:Init({
MatchWorkspaceWind = true, -- WindShake will use workspace.GlobalWind
})
-- 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.