玩过射击类游戏,里面的狙击枪是带有瞄准镜的,可以方便玩家可以瞄准远处的敌人,本篇文章要介绍的就是这个功能的实现,通过 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实现瞄准镜效果之美_Unity教程

 

瞄准后:

Unity实现瞄准镜效果之美_Unity教程_02

 

简单的效果大致是有了,但是总觉得有些不足,我们实际上可以 瞄准时候只在圆圈方位内显示所看到的物体

 

还好,我们的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 initialization
    void Start()
    {
        initFOV = Camera.main.fieldOfView;
        vignette = GetComponent<Vignetting>();
    }
    // Update is called once per frame
    void 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);
        }
    }
}

 

调整后效果:

Unity实现瞄准镜效果之美_Unity_03

Unity实现瞄准镜效果之美_Unity_04

 

 

这样效果是不是就明显多了,以上就是关于瞄准镜效果的实现,功能上要说实现也不复杂,就是需要大家不出错。