Unity 2D遊戲開發教程之攝像頭追蹤功能

Unity 2D遊戲開發教程之攝像頭追蹤功能

上一章,咱們建立了一個簡單的2D遊戲。此遊戲中的精靈有3個狀態:idleleftright。這看起來確實很酷!可是僅有的3個狀態卻限制了精靈的能力,以及遊戲邏輯的想象空間。看來有必要讓精靈擁有更多的狀態,而這就是本章要講解的主要內容。函數

攝像頭追蹤功能

遊戲裏的精靈能夠在遊戲場景中任意移動,這沒什麼問題,但是這就致使了一個問題,就是精靈可能移動到咱們的視野以外,或者說遊戲視圖以外。爲了解決這個問題,不少遊戲都採用了「攝像頭追蹤」的方法,使得攝像頭的位置會隨着精靈的移動而移動。例如,《超級瑪麗》中,精靈始終處於視圖中心的位置,如圖2-1所示。動畫

2-1  《超級瑪麗》中,精靈始終位於遊戲視圖的中心spa

要爲咱們開發的遊戲添加「攝像頭追蹤」的功能,就須要使用腳本編寫這樣一種邏輯。在Project視圖的Scripts文件夾裏,新建一個C#腳本,命名爲CameraController,爲此腳本添加下面的代碼:orm

  • 01     using UnityEngine;對象

  • 02     using System.Collections;教程

  • 03    遊戲

  • 04     public class CameraController : MonoBehaviourip

  • 05     {遊戲開發

  • 06              //公有屬性開發

  • 07              //表示精靈當前的動畫狀態

  • 08              public PlayerStateController.playerStates currentPlayerState = PlayerStateController.playerStates.idle;

  • 09              public GameObject playerObject = null;                                //表示精靈對象

  • 10              public float cameraTrackingSpeed = 1f;                               //表示攝像機的追蹤速度

  • 11              //私有屬性

  • 12              private Vector3 lastTargetPosition = Vector3.zero;             //上一目標位置

  • 13              private Vector3 currTargetPosition = Vector3.zero;             //下一目標位置

  • 14              private float currLerpDistance = 0.0f;

  • 15              //方法

  • 16              void Start()

  • 17              {

  • 18                       Vector3 playerPos = playerObject.transform.position;                //記錄精靈的位置

  • 19                       Vector3 cameraPos = transform.position;                                               //記錄攝像機的位置

  • 20                       Vector3 startTargPos = playerPos;

  • 21                       lastTargetPosition = startTargPos;

  • 22                       currTargetPosition = startTargPos;

  • 23              }

  • 24              //加入訂閱者列表

  • 25              void OnEnable()

  • 26              {

  • 27                       PlayerStateController.onStateChange += onPlayerStateChange;

  • 28              }

  • 29              //從訂閱者列表中退出

  • 30              void OnDisable()

  • 31              {

  • 32                       PlayerStateController.onStateChange -= onPlayerStateChange;

  • 33              }

  • 34              //實時記錄遊戲精靈當前的動畫狀態

  • 35              void onPlayerStateChange(PlayerStateController.playerStates newState)

  • 36              {

  • 37                       currentPlayerState = newState;

  • 38              }

  • 39              void LateUpdate()

  • 40              {

  • 41                       //依據當前精靈的動畫狀態,實時更新

  • 42                       onStateCycle();

  • 43                       //將攝像頭移動到目標位置

  • 44                       currLerpDistance += cameraTrackingSpeed;

  • 45                       transform.position = Vector3.Lerp(lastTargetPosition, currTargetPosition, currLerpDistance);

  • 46              }

  • 47              void onStateCycle()

  • 48              {

  • 49                       switch(currentPlayerState)

  • 50                       {

  • 51                                 case PlayerStateController.playerStates.idle:

  • 52                                          trackPlayer();

  • 53                                break;

  • 54                                 case PlayerStateController.playerStates.left:

  • 55                                          trackPlayer();

  • 56                                 break;

  • 57                                 case PlayerStateController.playerStates.right:

  • 58                                          trackPlayer();

  • 59                                 break;

  • 60                       }

  • 61              }

  • 62              void trackPlayer()

  • 63              {

  • 64                       //獲取並保存攝像機和精靈在世界座標系的座標

  • 65                        Vector3 currCamPos = transform.position;       

  • 66                       Vector3 currPlayerPos = playerObject.transform.position;

  • 67                       lastTargetPosition = currCamPos;

  • 68                       currTargetPosition = currPlayerPos;

  • 69                       currTargetPosition.z = currCamPos.z;                          //保證攝像頭z軸方向上的值不變

  • 70              }

  • 71     }

將此腳本賦予Hierarchy視圖裏的Main Camera對象,選中後者,而後在Inspector視圖裏設置此腳本組件的下列屬性,如圖2-2所示。

  • q   Player ObjectPlayer。表示攝像頭要追蹤的精靈對象;

  • q   Camera Tracking Speed1。此屬性值範圍是0~1,若爲0時,攝像頭不會追蹤精靈,若爲1時,攝像頭能夠在瞬間追蹤到精靈對象;

2-2  Main Camera對象的腳本組件上各屬性的設置

對於此腳本有如下幾點須要說明:

  • q   腳本69行的代碼使得攝像頭與精靈對象不至於重合。要讓攝像頭實時追蹤遊戲精靈,只要實時更新攝像頭的位置便可。就是要讓它的位置與精靈的位置一致,可是它們在Z軸方向上的值不能相同,如圖2-3所示。不然攝像頭與精靈會發生重合,使得遊戲視圖裏精靈對象消失,如圖2-4所示。

2-3  攝像頭與精靈在Z方向上的值不一樣

2-4  攝像頭與精靈在Z方向上的值相同

  • q   腳本45行的Vector3.Lerp()函數,是完成攝像頭實時追蹤功能的主要函數。這個函數會將一個對象,以必定的速度從一個位置移動到另外一個位置;

運行遊戲,而後使用鍵盤上的方向鍵控制精靈左右移動,你會發現遊戲視圖會和精靈一同移動,甚至是精靈由於脫離地面發生墜落時,也不例外,如圖2-5所示。

2-5  攝像頭追蹤功能,精靈始終位於遊戲視圖的中心

本文選自:Unity 2D遊戲開發快速入門大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

相關文章
相關標籤/搜索