Skip to content
Snippets Groups Projects
FOVKick.cs 2.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • BenniHome's avatar
    BenniHome committed
    using System;
    using System.Collections;
    using UnityEngine;
    
    namespace UnityStandardAssets.Utility
    {
        [Serializable]
        public class FOVKick
        {
            public Camera Camera;                           // optional camera setup, if null the main camera will be used
            [HideInInspector] public float originalFov;     // the original fov
            public float FOVIncrease = 3f;                  // the amount the field of view increases when going into a run
            public float TimeToIncrease = 1f;               // the amount of time the field of view will increase over
            public float TimeToDecrease = 1f;               // the amount of time the field of view will take to return to its original size
            public AnimationCurve IncreaseCurve;
    
    
            public void Setup(Camera camera)
            {
                CheckStatus(camera);
    
                Camera = camera;
                originalFov = camera.fieldOfView;
            }
    
    
            private void CheckStatus(Camera camera)
            {
                if (camera == null)
                {
                    throw new Exception("FOVKick camera is null, please supply the camera to the constructor");
                }
    
                if (IncreaseCurve == null)
                {
                    throw new Exception(
                        "FOVKick Increase curve is null, please define the curve for the field of view kicks");
                }
            }
    
    
            public void ChangeCamera(Camera camera)
            {
                Camera = camera;
            }
    
    
            public IEnumerator FOVKickUp()
            {
                float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);
                while (t < TimeToIncrease)
                {
                    Camera.fieldOfView = originalFov + (IncreaseCurve.Evaluate(t/TimeToIncrease)*FOVIncrease);
                    t += Time.deltaTime;
                    yield return new WaitForEndOfFrame();
                }
            }
    
    
            public IEnumerator FOVKickDown()
            {
                float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);
                while (t > 0)
                {
                    Camera.fieldOfView = originalFov + (IncreaseCurve.Evaluate(t/TimeToDecrease)*FOVIncrease);
                    t -= Time.deltaTime;
                    yield return new WaitForEndOfFrame();
                }
                //make sure that fov returns to the original size
                Camera.fieldOfView = originalFov;
            }
        }
    }