上一章,咱們建立了一個簡單的2D遊戲。此遊戲中的精靈有3個狀態:idle、left和right。這看起來確實很酷!可是僅有的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 Object:Player。表示攝像頭要追蹤的精靈對象;
q Camera Tracking Speed:1。此屬性值範圍是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人!