Files
WhiteMan_Unity2D/Assets/Hovl Studio/HSFiles/Scripts/For demo scenes/HS_CameraShaker.cs

77 lines
2.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HS_CameraShaker : MonoBehaviour
{
public Transform cameraObject;
public float amplitude;
public float frequency;
public float duration;
public float timeRemaining;
private Vector3 noiseOffset;
private Vector3 noise;
private AnimationCurve smoothCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f, Mathf.Deg2Rad * 0.0f, Mathf.Deg2Rad * 720.0f), new Keyframe(0.2f, 1.0f), new Keyframe(1.0f, 0.0f));
void Start()
{
float rand = 32.0f;
noiseOffset.x = Random.Range(0.0f, rand);
noiseOffset.y = Random.Range(0.0f, rand);
noiseOffset.z = Random.Range(0.0f, rand);
}
public IEnumerator Shake(float amp, float freq, float dur, float wait)
{
yield return new WaitForSeconds(wait);
float rand = 32.0f;
noiseOffset.x = Random.Range(0.0f, rand);
noiseOffset.y = Random.Range(0.0f, rand);
noiseOffset.z = Random.Range(0.0f, rand);
amplitude = amp;
frequency = freq;
duration = dur;
timeRemaining += dur;
if (timeRemaining > dur)
{
timeRemaining = dur;
}
}
void Update()
{
if (timeRemaining <= 0)
return;
float deltaTime = Time.deltaTime;
timeRemaining -= deltaTime;
float noiseOffsetDelta = deltaTime * frequency;
noiseOffset.x += noiseOffsetDelta;
noiseOffset.y += noiseOffsetDelta;
noiseOffset.z += noiseOffsetDelta;
noise.x = Mathf.PerlinNoise(noiseOffset.x, 0.0f);
noise.y = Mathf.PerlinNoise(noiseOffset.y, 1.0f);
noise.z = Mathf.PerlinNoise(noiseOffset.z, 2.0f);
noise -= Vector3.one * 0.5f;
noise *= amplitude;
float agePercent = 1.0f - (timeRemaining / duration);
noise *= smoothCurve.Evaluate(agePercent);
}
void LateUpdate()
{
if (timeRemaining <= 0)
return;
Vector3 positionOffset = Vector3.zero;
Vector3 rotationOffset = Vector3.zero;
positionOffset += noise;
rotationOffset += noise;
cameraObject.transform.localPosition = positionOffset;
cameraObject.transform.localEulerAngles = rotationOffset;
}
}