Using Using Public Class Public Float Public Float Public Float Float Float Float New New New Void

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 2

/*******************************************************************************/

/*!
\file Screenshake.cs
\author Khan Sweetman
\par All content 2015 DigiPen (USA) Corporation, all rights reserved.
\par Team That Thumb is Satin
\brief
File does does things. COOL things.
*/
/*******************************************************************************/
using UnityEngine;
using System.Collections;
public class Screenshake : MonoBehaviour
{
[SerializeField] public float ShakeTime = 0.5f;
[SerializeField] public float Frequency = 12.0f;
[SerializeField] public float Displacement = 0.5f;
// Timers
float Timer = 0.0f;
float FreqTime = 0.0f;
float FreqTimer = 0.0f;
// Direction
Vector3 DefaultPos = new Vector3();
Vector3 NextPos = new Vector3();
Vector3 PrevPos = new Vector3();
// Use this for initialization
void Start ()

{
// Grab variables
DefaultPos = transform.localPosition;
// TODO:
// - Add an if check to see if we should programatically add the shaker
// - else (assume we shake the object directly) { ... }
}
// Wrapper around core of this file. Call whenever you want to shake the camera.
public void Shake()
{
// Update variables before beginning
FreqTime = 1.0f / Frequency;
FreqTimer = FreqTime;
Timer = ShakeTime;
PrevPos = NextPos = DefaultPos;
StartCoroutine(ShakeCoroutine());
}
IEnumerator ShakeCoroutine()
{
// Shake while there is still time left to shake

while (Timer > 0.0f)


{
// Calculate NewPos every time through the loop
PrevPos = NextPos;
NextPos = DefaultPos + Random.insideUnitSphere * Displacement;
// Lerping towards this time interval's destination
while (FreqTimer > 0.0f)
{
FreqTimer -= Time.deltaTime;
float proportionalTime = (FreqTime - FreqTimer) / FreqTime;
transform.localPosition = Vector3.Lerp(PrevPos, NextPos, proportionalTime);
yield return null;
}
// Update Timer using the time passed in FreqTimer's loop
Timer -= FreqTime;
FreqTimer = FreqTime;
}

// Return to center, aka, the original offset from parent position


// Returns in a timespan of FreqTime
// Only do this if not being shaken
FreqTimer = FreqTime;
PrevPos = NextPos;
while (transform.localPosition != DefaultPos && Timer < 0.0f)
{
FreqTimer -= Time.deltaTime;
float proportionalTime = 1.0f / ((FreqTime - FreqTimer) / FreqTime);
transform.localPosition = Vector3.Lerp(PrevPos, DefaultPos, proportionalTime);
yield return null;
}
}

You might also like