您的位置:首页 > 移动开发 > Unity3D

Unity制作一个望远镜与查看器摄像机

2015-10-21 13:53 543 查看


Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机


Unity中制作一个望远镜

本节制作的望远镜,在鼠标左键按下时,看到的视图会变大;当不再按下的时候,会慢慢缩小成原来的视图。游戏中时常出现的狙击手就是使用望远镜的一个例子,如图2-22所示。



图2-22  游戏中狙击手所看到的视图

制作望远镜的过程如下:

(1)在Project视图里,创建一个C#脚本文件,命名为TelescopicView。打开这个脚本文件,并在里面添加下面的代码:

01     using UnityEngine;

02     using System.Collections;

03    

04     public class TelescopicView : MonoBehaviour

05     {

06              //公有成员

07              public float ZoomLevel = 2.0f;

08              public float ZoomInSpeed = 100.0f;

09              public float ZoomOutSpeed = 100.0f;

10              //私有成员

11              private float initFOV;

12              //脚本初始化时,调用此函数

13              void Start ()

14              {

15                        //获取当前摄像机的视野范围

16                       initFOV = Camera.main.fieldOfView;

17              }

18              //运行游戏时的每一帧,都调用此函数

19              void Update ()

20              {

21                        //当鼠标左键按下时

22                       if (Input.GetKey(KeyCode.Mouse0))

23                       {

24                                 ZoomView();

25                       }

26                       else

27                       {

28                                 ZoomOut();

29                       }

30              }

31              //放大摄像机的视野区域

32              void ZoomView()

33              {

34                       if (Mathf.Abs(Camera.main.fieldOfView - (initFOV / ZoomLevel)) < 0.5f)

35                       {

36                                 Camera.main.fieldOfView = initFOV / ZoomLevel;

37                       }

38                       else if (Camera.main.fieldOfView - (Time.deltaTime * ZoomInSpeed) >= (initFOV / ZoomLevel))

39                       {

40                                 Camera.main.fieldOfView -= (Time.deltaTime * ZoomInSpeed);

41                       }

42              }

43              //缩小摄像机的视野区域

44              void ZoomOut()

45              {

46                       if (Mathf.Abs(Camera.main.fieldOfView - initFOV) < 0.5f)

47                       {

48                                 Camera.main.fieldOfView = initFOV;

49                       }

50                       else if (Camera.main.fieldOfView + (Time.deltaTime * ZoomOutSpeed) <= initFOV)

51                       {

52                                 Camera.main.fieldOfView += (Time.deltaTime * ZoomOutSpeed);

53                       }

54              }

55     }

放大和缩小摄像机的视野区域,依靠的变量是Camera.main.fieldOfView,所以代码32行的ZoomView()和44行的ZoomOut()就是通过改变Camera.main.fieldOfView的大小,进而调节视野区域的大小的。

(2)将脚本TelescopicView添加到Main
Camera上,选中后者后,在Inspector视图上查看脚本组件中的各属性,如图2-23所示。Zoom
Level可以调节视图能放大到什么程度;Zoom In Speed调节视图的放大速度;Zoom
Out Speed调节视图缩小的速度。



图2-23  TelescopicView组件上的各属性

(3)运行游戏,当鼠标左键按下时,视图会放大,松开时,视图会慢慢恢复成原来的样子。如图2-24所示。



图2-24  视图的放大与缩小

(4)如果读者此时使用的Unity是付费版本的话,还可以把这个望远镜的视图效果做的更形象一些。在Unity里,单击Assets|Import
Package|Image Effects(Pro only)命令,导入Image Effects(图像效果)资源包,如图2-25所示。

(5)选中Main
Camera,单击Component|Image Effects|Vignette命令,为它添加Vignette(光晕、光损失)组件,如图2-26所示。



图2-25  导入Image
Effects资源包           图2-26  添加Vignette组件

(6)再次运行游戏。当鼠标左键按下时,望远镜的视图效果更逼真了(添加了光晕的效果),如图2-27所示。



图2-27  望远镜视图的放大与缩小


Unity中制作一个查看器摄像机

如果是一个侦探类的游戏,在侦探找到一个可疑物品时,总会四下打量这个物品,有时还会拿着放大镜放大一些细节的地方。而本节要制作的查看器摄像机,就模拟了这一过程,它的操作类似于在Scene视图上对游戏对象所做的旋转和缩放操作。制作步骤如下:

(1)在Project视图里,创建一个C#脚本文件,命名为InspectCamera。打开这个脚本文件,并在里面添加下面的代码:

01     using UnityEngine;

02     using System.Collections;

03     //添加一个菜单项

04     [AddComponentMenu("Camera-Control/Inspect Camera")]

05     public class InspectCamera: MonoBehaviour

06     {

07              //公有成员

08              public Transform target;                               //查看器摄像机查看的目标对象

09              public float distance= 10.0f;                         //摄像机与目标对象间的距离

10              public float xSpeed= 250.0f;                        //横向旋转目标对象时的速度

11              public float ySpeed= 120.0f;                        //纵向旋转目标对象时的速度

12              public float yMinLimit= -20.0f;                     //纵向旋转目标对象时的范围(最小值)

13              public float yMaxLimit= 80.0f;                     //纵向旋转目标对象时的范围(最大值)

14              public float zoomInLimit= 2.0f;                            //最大的方法倍数

15              public float zoomOutLimit= 1.0f;                //最小的缩小倍数

16              //私有成员

17              private float x= 0.0f;

18              private float y= 0.0f;

19              private float initialFOV; 

20              //脚本初始化时调用

21              void Start ()

22              {

23                       initialFOV = camera.fieldOfView;

24                       transform.position = new Vector3(0.0f, 0.0f, -distance) + target.position;

25                       Vector3 angles= transform.eulerAngles;

26                       x = angles.y;

27                       y = angles.x;

28                        if (rigidbody)

29                                 rigidbody.freezeRotation = true;

30              }

31              //在每帧即将结束时调用

32              void  LateUpdate ()

33              {

34                        //按下鼠标左键时

35                       if (target && Input.GetMouseButton(0))

36                       {

37                                 //按下键盘左边的Shift,或者右边的Shift

38                                 if(Input.GetKey(KeyCode.RightShift) || Input.GetKey(KeyCode.LeftShift))

39                                 {

40                                          float zoom= camera.fieldOfView - Input.GetAxis ("Mouse Y");

41                                          if(zoom >= initialFOV / zoomInLimit && zoom <= initialFOV / zoomOutLimit)

42                                          {

43                                                    //改变摄像机视图的大小

44                                                   camera.fieldOfView -= Input.GetAxis ("Mouse Y");

45                                          }                                              

46                                 }

47                                 else

48                                 {

49                                          x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;

50                                          y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

51                                 }

52                                 y = ClampAngle(y, yMinLimit, yMaxLimit);

53                                 Quaternion rotation= Quaternion.Euler(y, x, 0);

54                                 Vector3 position= rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;

55                                 //修改旋转度和位置

56                                 transform.rotation = rotation;

57                                 transform.position = position;

58                       }

59              }

60              //旋转的角度范围

61              static float  ClampAngle ( float angle ,   float min ,   float max  )

62              {

63                       if (angle < -360.0f)

64                                 angle += 360.0f;

65                       if (angle > 360.0f)

66                                 angle -= 360.0f;

67                       return Mathf.Clamp (angle, min, max);

68              }

69     }

(2)将脚本InspectCamera添加到Main
Camera上,选中后者,在查看器中查看脚本组件中的各属性,如图2-28所示。各属性的意义在脚本的08~15行有注释说明,这里不再重复。

注意:需要给Target属性赋予一个明确的游戏对象,本示例赋予的是Capsule(胶囊),如图2-29所示。



图2-28  添加到Main
Camera上的脚本组件中的各属性         图2-29  场景中的Capsule对象

(3)为游戏场景添加Directional
light,并保证此对象上光的照射方向与摄像机的视图方向一致,这会使得摄像机的视图,所呈现的对象的正面是被照亮的。然后在Hierarchy视图里拖动Directional
light到Main Camera,使前者称为后者的子对象,如图2-30所示。如此一来,Directional
light就会随着Main Camera的移动而移动。最后达到的效果,就像是人物角色的帽子上有手电筒,人往哪里看,光就往哪里照;人走到哪里,光就跟到哪里。



图2-30  Directional light与Main
Camera的设置

(4)运行游戏,在Game视图里,按下鼠标左键并移动,视图会绕着目标对象移动;按下鼠标的同时按下键盘上的Shift键,上下移动鼠标可以放大和缩小视图所看到的目标对象,如图2-31所示。



图2-31  查看器摄像机运行效果

本文选自:Unity
游戏开发技巧集锦大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d