Unity 遊戲開發技巧集錦之製做一個望遠鏡與查看器攝像機

Unity 遊戲開發技巧集錦之製做一個望遠鏡與查看器攝像機

Unity中製做一個望遠鏡

本節制做的望遠鏡,在鼠標左鍵按下時,看到的視圖會變大;當再也不按下的時候,會慢慢縮小成原來的視圖。遊戲中時常出現的狙擊手就是使用望遠鏡的一個例子,如圖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  望遠鏡視圖的放大與縮小

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 lightMain Camera,使前者稱爲後者的子對象,如圖2-30所示。如此一來,Directional light就會隨着Main Camera的移動而移動。最後達到的效果,就像是人物角色的帽子上有手電筒,人往哪裏看,光就往哪裏照;人走到哪裏,光就跟到哪裏。

2-30  Directional lightMain Camera的設置

4)運行遊戲,在Game視圖裏,按下鼠標左鍵並移動,視圖會繞着目標對象移動;按下鼠標的同時按下鍵盤上的Shift鍵,上下移動鼠標能夠放大和縮小視圖所看到的目標對象,如圖2-31所示。

2-31  查看器攝像機運行效果

本文選自:Unity 遊戲開發技巧集錦大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

相關文章
相關標籤/搜索