77 lines
2.3 KiB
C#
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;
|
|
}
|
|
}
|