七、游戏表现:5、相机抖动效果
2021-03-31 本文已影响0人
GameObjectLgy
using UnityEngine;
using System.Collections;
public class CameraShakeHepler : MonoBehaviour
{
public AnimationCurve ShakeCurve = AnimationCurve.EaseInOut(0, 1, 1, 0);
[Header("持续时间")]
public float Duration = 2;
[Header("震动频率")]
public float Speed = 22;
[Header("震动强度")]
public float Magnitude = 1;
[Range(1, 500)]
public float DistanceForce = 100;
public float RotationDamper = 2;
public bool IsEnabled = true;
bool isPlaying;
[HideInInspector]
public bool canUpdate;
void PlayShake()
{
StopAllCoroutines();
StartCoroutine(Shake());
}
void Update()
{
if (isPlaying && IsEnabled) {
isPlaying = false;
PlayShake();
}
if (Input.GetKeyDown(KeyCode.Space))
{
PlayShake();
}
}
void OnEnable()
{
isPlaying = true;
var shakes = FindObjectsOfType(typeof(CameraShakeHepler)) as CameraShakeHepler[];
if(shakes!=null)
foreach (var shake in shakes)
{
shake.canUpdate = false;
}
canUpdate = true;
}
IEnumerator Shake()
{
var elapsed = 0.0f;
var camT = Camera.main.transform;
var originalCamRotation = camT.rotation.eulerAngles;
var direction = (transform.position - camT.position).normalized;
var time = 0f;
var randomStart = Random.Range(-1000.0f, 1000.0f);
var distanceDamper = 1 - Mathf.Clamp01((camT.position - transform.position).magnitude / DistanceForce);
Vector3 oldRotation = Vector3.zero;
while (elapsed < Duration && canUpdate) {
elapsed += Time.deltaTime;
var percentComplete = elapsed / Duration;
var damper = ShakeCurve.Evaluate(percentComplete) * distanceDamper;
time += Time.deltaTime * damper;
camT.position -= direction * Time.deltaTime * Mathf.Sin(time * Speed) * damper * Magnitude/2;
var alpha = randomStart + Speed * percentComplete / 10;
var x = Mathf.PerlinNoise(alpha, 0.0f) * 2.0f - 1.0f;
var y = Mathf.PerlinNoise(1000 + alpha, alpha + 1000) * 2.0f - 1.0f;
var z = Mathf.PerlinNoise(0.0f, alpha) * 2.0f - 1.0f;
if (Quaternion.Euler(originalCamRotation + oldRotation)!=camT.rotation)
originalCamRotation = camT.rotation.eulerAngles;
oldRotation = Mathf.Sin(time * Speed) * damper * Magnitude * new Vector3(0.5f + y, 0.3f + x, 0.3f + z) * RotationDamper;
camT.rotation = Quaternion.Euler(originalCamRotation + oldRotation);
yield return null;
}
}
}
21.png