美文网首页
七、游戏表现:5、相机抖动效果

七、游戏表现:5、相机抖动效果

作者: GameObjectLgy | 来源:发表于2021-03-31 20:19 被阅读0次
    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

    相关文章

      网友评论

          本文标题:七、游戏表现:5、相机抖动效果

          本文链接:https://www.haomeiwen.com/subject/qelgiktx.html