Unity实现瞄准镜效果之美
玩过射击类游戏,里面的狙击枪是带有瞄准镜的,可以方便玩家可以瞄准远处的敌人,本篇文章要介绍的就是这个功能的实现,通过 Camera来制作一个瞄准镜的效果。
主要的方法就是通过调整 Camera的 Field Of View,让其渐大渐小来实现。
当我们瞄准的时候,我们只需要将 Field Of View 变小,停止瞄准的时候,再将Field Of View 恢复成原来的大小。
代码如下:
if (Mathf.Abs(Camera.main.fieldOfView-(initFOV/ZoomLevel))<0.5f){Camera.main.fieldOfView = initFOV/ZoomLevel;}else if (Camera.main.fieldOfView-(Time.deltaTime*ZoomInSpeed)>=initFOV/ZoomLevel){Camera.main.fieldOfView -= Time.deltaTime*ZoomInSpeed;}
if (Mathf.Abs(Camera.main.fieldOfView - (initFOV/ZoomLevel)) < 0.5f){Camera.main.fieldOfView = initFOV;}else if (Camera.main.fieldOfView+(Time.deltaTime*ZoomOutSpeed)<=initFOV){Camera.main.fieldOfView += Time.deltaTime*ZoomOutSpeed;}
效果如下:
瞄准前
瞄准后:
简单的效果大致是有了,但是总觉得有些不足,我们实际上可以 瞄准时候只在圆圈方位内显示所看到的物体
还好,我们的Unity 为我们提供了 Image Effect 制作后期效果的资源包,可以把 Vignetting脚本附加到 Camera上,然后通过在脚本中 控制 Vignetting 实例的 intensity来达到我们所想要的镜头的效果。
由于 Vignetting脚本是用 javascript编写的,CSharp 在引用它的时候,会没有智能提示,完整的代码如下:
public class TelescopicView : MonoBehaviour {public float ZoomLevel = 2;public float ZoomInSpeed = 100f;public float ZoomOutSpeed = 100f;private float initFOV;private Vignetting vignette;private float vignetteAmount = 10.0f;// Use this for initializationvoid Start(){initFOV = Camera.main.fieldOfView;vignette = GetComponent<Vignetting>();}// Update is called once per framevoid Update(){if (Input.GetMouseButton(1)){ZoomView();}else{ZoomOut();}}private void ZoomView(){if (Mathf.Abs(Camera.main.fieldOfView-(initFOV/ZoomLevel))<0.5f){Camera.main.fieldOfView = initFOV/ZoomLevel;vignette.intensity = vignetteAmount;}else if (Camera.main.fieldOfView-(Time.deltaTime*ZoomInSpeed)>=initFOV/ZoomLevel){Camera.main.fieldOfView -= Time.deltaTime*ZoomInSpeed;vignette.intensity = vignetteAmount * (Camera.main.fieldOfView - initFOV) / ((initFOV / ZoomLevel) - initFOV);}}private void ZoomOut(){if (Mathf.Abs(Camera.main.fieldOfView - (initFOV/ZoomLevel)) < 0.5f){Camera.main.fieldOfView = initFOV;vignette.intensity = 0;}else if (Camera.main.fieldOfView+(Time.deltaTime*ZoomOutSpeed)<=initFOV){Camera.main.fieldOfView += Time.deltaTime*ZoomOutSpeed;vignette.intensity = vignetteAmount * (Camera.main.fieldOfView - initFOV) / ((initFOV / ZoomLevel) - initFOV);}} }
调整后效果:
这样效果是不是就明显多了,以上就是关于瞄准镜效果的实现,功能上要说实现也不复杂,就是需要大家不出错。