本節制做的望遠鏡,在鼠標左鍵按下時,看到的視圖會變大;當再也不按下的時候,會慢慢縮小成原來的視圖。遊戲中時常出現的狙擊手就是使用望遠鏡的一個例子,如圖2-22所示。函數
圖2-22 遊戲中狙擊手所看到的視圖spa
製做望遠鏡的過程以下:orm
(1)在Project視圖裏,建立一個C#腳本文件,命名爲TelescopicView。打開這個腳本文件,並在裏面添加下面的代碼:對象
01 using UnityEngine;遊戲
02 using System.Collections;資源
03 遊戲開發
04 public class TelescopicView : MonoBehaviour開發
05 {get
06 //公有成員it
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 望遠鏡視圖的放大與縮小
若是是一個偵探類的遊戲,在偵探找到一個可疑物品時,總會四下打量這個物品,有時還會拿着放大鏡放大一些細節的地方。而本節要製做的查看器攝像機,就模擬了這一過程,它的操做相似於在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人!