Unity基础包 FirstPersonController下的FOVKick 脚本研究
今天给大家介绍的是FirstPersonController下的FOVKick 脚本,可能有些人对FOVKick是干什么的都不知道,为此,就详细的说明下该脚本:
- // FOV field of view 视场角,Kick 踢
- // 简而言之,fov就是游戏中相机的可视角度,这个类就是用来在步行和奔跑间fov角度,步行时fov较小,而奔跑会增大fov,使可视角度更大,如果还是理解的不清晰的话,把下面FOVIncrease的值调整为80,然后在奔跑和步行间切换试试
- // ps.Camera组件中也有Field Of View参数,可以调整一下试试效果
- // 这个类在FixedUpdate中的GetInput中执行,当然需要开启fov。当时我不太理解,现在大家都明白这个类的作用了吧
- [Serializable]
- public class FOVKick
- {
- public Camera Camera; // 可选择设置Camera,如果没有设置,则为主Carmera
- [HideInInspector] public float originalFov; // fov的初始角度
- public float FOVIncrease = 3f; // 进入奔跑状态时,fov的增长值
- public float TimeToIncrease = 1f; // 完成fov增涨的秒数
- public float TimeToDecrease = 1f; // 这是减少,会回归fov的初始值
- public AnimationCurve IncreaseCurve; // fov值的增涨曲线
- // 设置Camera
- public void Setup(Camera camera)
- {
- CheckStatus(camera);
- // 将Camera赋值,并将fov值保存起来
- Camera = camera;
- originalFov = camera.fieldOfView;
- }
- // 检查Camera
- private void CheckStatus(Camera camera)
- {
- if (camera == null) //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");
- }
- }
- // 变换Camera,不过有个问题,没有改变fov初始值
- public void ChangeCamera(Camera camera)
- {
- Camera = camera;
- }
- // fov增加
- public IEnumerator FOVKickUp()
- {
- // 计算当前的fov值进行到了多少秒,有的人可能说直接设置为0不就行了,不过他们忘记了fov值没有完全回归初始值的情况,从中途开始增加,就是要通过计算了,当然从初始的fov值开始计算出来的就是0
- float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);
- while (t < TimeToIncrease)
- {
- // 根据增涨曲线和时间计算当前的fov值,直到t值大于等于完成时间,跳出循环
- Camera.fieldOfView = originalFov (IncreaseCurve.Evaluate(t/TimeToIncrease)*FOVIncrease);
- t = Time.deltaTime;
- yield return new WaitForEndOfFrame(); // 每帧执行一次,增涨一次
- }
- }
- // fov减少
- public IEnumerator FOVKickDown()
- {
- // 同样计算出当前的时间
- float t = Mathf.Abs((Camera.fieldOfView - originalFov)/FOVIncrease);
- while (t > 0)
- {
- // 这边的区别是t值减少,判断条件变为t>0,这样就会和fov增加函数相反的进行
- Camera.fieldOfView = originalFov (IncreaseCurve.Evaluate(t/TimeToDecrease)*FOVIncrease);
- t -= Time.deltaTime;
- yield return new WaitForEndOfFrame();
- }
- //保证fov值回归了初始值
- Camera.fieldOfView = originalFov;
- }
- }
这个玩意就是极品飞车中使用氮氧装置加速后,视野增大往后倾的一种感觉,很棒!嗯,回去打开游戏来试试,是有这种感觉吧?印象有点不深了。
哦,是Minecraft,话说unity的FPC脚本效果跟Minecraft中的好像。