Skip to content

Instantly share code, notes, and snippets.

@spaghettiSyntax
Created March 12, 2020 01:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spaghettiSyntax/4532528a2747ba15b51b2531bac55687 to your computer and use it in GitHub Desktop.
Save spaghettiSyntax/4532528a2747ba15b51b2531bac55687 to your computer and use it in GitHub Desktop.
A simple 2D screen shake built in Unity.
using UnityEngine;
public class ScreenShakeController : MonoBehaviour
{
// This is a singleton
public static ScreenShakeController _instance;
public float shakeTimeRemaining = 1f;
private float shakePower = 0.5f;
private float shakeFadeTime;
private float shakeRotation;
public float rotationMultiplier = 7.5f;
public bool screenShaking = false;
// Start is called before the first frame update
void Start()
{
// This is a singleton
_instance = this;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Z)
&& !screenShaking)
{
StartShake(shakeTimeRemaining, shakePower);
}
}
private void LateUpdate()
{
if (shakeTimeRemaining > 0
&& screenShaking)
{
shakeTimeRemaining -= Time.deltaTime;
float xAmount = Random.Range(-1f, 1f) * shakePower;
float yAmount = Random.Range(-1f, 1f) * shakePower;
transform.position += new Vector3(xAmount, yAmount, 0f);
shakePower = Mathf.MoveTowards(shakePower, 0f, (shakeFadeTime * Time.deltaTime));
shakeRotation = Mathf.MoveTowards(shakeRotation, 0f, (shakeFadeTime * rotationMultiplier * Time.deltaTime));
}
else
{
ResetShakeValues();
}
transform.rotation = Quaternion.Euler(0f, 0f, shakeRotation * Random.Range(-1f, 1f));
}
public void StartShake(float length, float power)
{
screenShaking = true;
shakeTimeRemaining = length;
shakePower = power;
shakeFadeTime = power / length;
shakeRotation = power * rotationMultiplier;
}
public void ResetShakeValues()
{
screenShaking = false;
shakeFadeTime = 0;
shakeTimeRemaining = 1f;
shakePower = 0.5f;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment