The Unity Asset Store has a free asset called EZ Camera Shake, which I have ported to Roblox.
Module:
GitHub repository:
The original author of the Unity3D asset, Road Turtle Games, gave me written permission via email to make and open-source this port to Roblox. I contacted the developer since there was no licensing information available for the Unity3D asset.
Just wondering, what would playerCFrame in your example be set to? Is it possible to play these shakes over the default camera and still have it rotate regularly somehow?
Also, I see a method for starting the shake which has a fade-in time, but I don’t see a method for fading out a shake, only an abrupt :Stop() method. How would I fade-out a shake over some time instead of stopping it abruptly, or does this module not provide for that yet?
playerCFrame is just an example of whatever camera logic you might already have. The idea is that you just multiply the existing CFrame of the camera to the shake CFrame. For instance, you could just set a higher render priority and set the loop to only manipulate the Camera’s CFrame directly, assuming another loop has already set it:
To your other question: It’s kinda weird. The “state” of an individual shake instance is determined in the CameraShakeInstance:GetState() method. If that state returns Inactive, then the CameraShaker object will automatically delete it from the update table.
But that still begs the question…how do you stop the shake instance? As far as I can tell, the way you stop it is by calling CameraShakeInstance:StartFadeOut(fadeOutTime). It’s unfortunate that you have to pass a fadeOutTime parameter, as that should already be set from the constructor, so I am going to make a change to make it an optional parameter.
When you call StartFadeOut, it runs the appropriate fading math on the update loop, and thus ends up changing the calculated state to Inactive eventually.
Update: I confirmed that calling StartFadeOut is how you stop a sustained shake. However, the existing code did not allow for a preset shake to be sustained, so I added another ShakeSustain method. Also, based on the logic of the code, StartFadeOutmust supply a fade out value, as sustained shakes overwrite the original fade out value to 0.
Example using the Earthquake preset:
local earthquakeShake = nil
local function RightClicked()
if (earthquakeShake) then
earthquakeShake:StartFadeOut(10)
earthquakeShake = nil
else
earthquakeShake = camShake:ShakeSustain(camShake.Presets.Earthquake)
end
end
Woooooow. Very very neat. It would be cool to see more games utilizing the camera in this sort of way, it really adds an extra layer of depth to the game.
Edit Also in the camera shake instance module, why are you subtracting 0.5 from the noise’s for x,y, and z? The roblox wiki says that they already return values between -1 and 1 (lines 55-57)
Good catch! I translated the code from C# to Lua very quickly, so weird errors like that were bound to happen.
As for the noise, I also failed to look into the difference between Unity’s PerlinNoise function and Roblox’s noise function. In Unity, it returns between 0 and 1, and I didn’t notice that until now. The obvious fix would be to add 1 to the result, and then divide it by 2, thus giving the same 0 - 0.5 range: [(1 + noise) / 2)] However, I actually want a -0.5 - 0.5 range, thus I am changing it to simply multiply by 0.5 instead of subtract.
Thanks for posting about that. Those fixes are now published.