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人!