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


瞄准后:

Unity实现瞄准镜效果之美_javascript_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实现瞄准镜效果之美_javascript_03

Unity实现瞄准镜效果之美_javascript_04



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