Unity基础包 FirstPersonController下的FOVKick 脚本研究

发表于2017-11-08
评论0 2k浏览

今天给大家介绍的是FirstPersonController下的FOVKick 脚本,可能有些人对FOVKick是干什么的都不知道,为此,就详细的说明下该脚本:

  1. // FOV field of view 视场角,Kick 踢  
  2. // 简而言之,fov就是游戏中相机的可视角度,这个类就是用来在步行和奔跑间fov角度,步行时fov较小,而奔跑会增大fov,使可视角度更大,如果还是理解的不清晰的话,把下面FOVIncrease的值调整为80,然后在奔跑和步行间切换试试  
  3. // ps.Camera组件中也有Field Of View参数,可以调整一下试试效果  
  4. // 这个类在FixedUpdate中的GetInput中执行,当然需要开启fov。当时我不太理解,现在大家都明白这个类的作用了吧  
  5. [Serializable]  
  6. public class FOVKick  
  7. {  
  8.     public Camera Camera;                           // 可选择设置Camera,如果没有设置,则为主Carmera  
  9.     [HideInInspector] public float originalFov;     // fov的初始角度  
  10.     public float FOVIncrease = 3f;                  // 进入奔跑状态时,fov的增长值  
  11.     public float TimeToIncrease = 1f;               // 完成fov增涨的秒数  
  12.     public float TimeToDecrease = 1f;               // 这是减少,会回归fov的初始值  
  13.     public AnimationCurve IncreaseCurve;            // fov值的增涨曲线  
  14.   
  15.     // 设置Camera  
  16.     public void Setup(Camera camera)  
  17.     {  
  18.         CheckStatus(camera);  
  19.   
  20.         // 将Camera赋值,并将fov值保存起来  
  21.         Camera = camera;  
  22.         originalFov = camera.fieldOfView;  
  23.     }  
  24.   
  25.     // 检查Camera  
  26.     private void CheckStatus(Camera camera)  
  27.     {  
  28.         if (camera == null//Camera是null的报错  
  29.         {  
  30.             throw new Exception("FOVKick camera is null, please supply the camera to the constructor");  
  31.         }  
  32.   
  33.         if (IncreaseCurve == null)  //增涨曲线是空的,报错!  
  34.         {  
  35.             throw new Exception(  
  36.                 "FOVKick Increase curve is null, please define the curve for the field of view kicks");  
  37.         }  
  38.     }  
  39.   
  40.     // 变换Camera,不过有个问题,没有改变fov初始值  
  41.     public void ChangeCamera(Camera camera)  
  42.     {  
  43.         Camera = camera;  
  44.     }  
  45.   
  46.     // fov增加  
  47.     public IEnumerator FOVKickUp()  
  48.     {  
  49.         // 计算当前的fov值进行到了多少秒,有的人可能说直接设置为0不就行了,不过他们忘记了fov值没有完全回归初始值的情况,从中途开始增加,就是要通过计算了,当然从初始的fov值开始计算出来的就是0  
  50.         float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);      
  51.         while (t < TimeToIncrease)  
  52.         {  
  53.             // 根据增涨曲线和时间计算当前的fov值,直到t值大于等于完成时间,跳出循环  
  54.             Camera.fieldOfView = originalFov   (IncreaseCurve.Evaluate(t/TimeToIncrease)*FOVIncrease);  
  55.             t  = Time.deltaTime;  
  56.   
  57.             yield return new WaitForEndOfFrame();   // 每帧执行一次,增涨一次  
  58.         }  
  59.     }  
  60.   
  61.     // fov减少  
  62.     public IEnumerator FOVKickDown()  
  63.     {  
  64.         // 同样计算出当前的时间  
  65.         float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);  
  66.   
  67.         while (t > 0)  
  68.         {  
  69.             // 这边的区别是t值减少,判断条件变为t>0,这样就会和fov增加函数相反的进行  
  70.             Camera.fieldOfView = originalFov   (IncreaseCurve.Evaluate(t/TimeToDecrease)*FOVIncrease);  
  71.             t -= Time.deltaTime;  
  72.             yield return new WaitForEndOfFrame();  
  73.         }  
  74.   
  75.         //保证fov值回归了初始值  
  76.         Camera.fieldOfView = originalFov;  
  77.     }  
  78. }  

这个玩意就是极品飞车中使用氮氧装置加速后,视野增大往后倾的一种感觉,很棒!嗯,回去打开游戏来试试,是有这种感觉吧?印象有点不深了。


哦,是Minecraft,话说unity的FPC脚本效果跟Minecraft中的好像。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引