目前爲止,遊戲項目裏的精靈只有Idle和Walking這兩種狀態。也就是說,不管精靈在遊戲裏作什麼,它都不會進入其它的狀態,如死亡。因而咱們發現遊戲裏的精靈,即便是跳入「萬丈深淵」,也依然存活,顯然這種遊戲邏輯沒法讓人接受。所以,本節就來講明爲精靈添加死亡和重生這兩種狀態的方法,並使用腳本實現這兩種狀態的邏輯。具體的實現步驟以下:ide
(1)在Hierarchy視圖裏,新建一個Empty對象,並命名爲Death Trigger,設置其Position屬性爲(0,0,0)。而後爲此對象添加Box Collider 2D組件,並設置此組件的下列屬性,如圖2-6所示。函數
q 選中Is Trigger屬性;動畫
q Size:(20,1);ui
q Center:(0,-2.5);spa
圖2-6 對象上Box Collider 2D組件的屬性設置orm
回看此時的Scene視圖,可知此步操做添加了一個綠色線框的矩形,如圖2-7所示。咱們但願當精靈與此矩形發生接觸時,精靈會死亡。對象
圖2-7 表示Empty對象範圍的矩形框教程
(2)當精靈死亡之後,要想繼續遊戲,精靈必須在指定的位置重生才行,並且這個位置在精靈對象重生之後,不會讓精靈被動的接觸到Death Trigger對象。在Hierarchy視圖裏,再新建一個Empty對象,並命名爲Player Respawn Point,設置其Position屬性爲(0,1,5,0),也就是說重生的點位於地面正上方的指定位置處,如圖2-8所示。遊戲
圖2-8 設置精靈重生點的位置ip
(3)打開Project視圖裏的PlayerStateController腳本,將死亡和重生這兩種狀態加到表示精靈狀態的枚舉類型中,以下代碼中加粗的部分:
01 using UnityEngine;
02 using System.Collections;
03
04 public class PlayerStateController : MonoBehaviour
05 {
06 //定義遊戲人物的各類狀態
07 public enum playerStates
08 {
09 idle = 0, //表示空閒
10 left, //表示左移
11 right, //表示右移
12 kill, //表示死亡
13 resurrect //表示重生
14 }
15 … //省略
16 }
(4)在Project視圖的Script文件夾裏,新建一個C#腳本,命名爲DeathTriggerScript,用於實現當精靈與Death Trigger接觸時,精靈死亡的邏輯。爲此腳本添加下面的代碼:
01 using UnityEngine;
02 using System.Collections;
03
04 public class DeathTriggerScript : MonoBehaviour
05 {
01 //當精靈進入到Death Trigger的矩形範圍內時,調用此函數
02 void OnTriggerEnter2D( Collider2D collidedObject )
03 {
04 //調用精靈對象上PlayerStateListener腳本組件裏的hitDeathTrigger()方法
05 collidedObject.SendMessage("hitDeathTrigger");
06 }
07 }
將此腳本賦予Hierarchy視圖裏的Death Trigger對象。腳本05行,調用的方法hitDeathTrigger()尚未在PlayerStateListener腳本里定義,請將下面的方法定義添加到PlayerStateListener腳本里,定義以下:
01 using UnityEngine;
02 using System.Collections;
03
04 [RequireComponent(typeof(Animator))]
05 public class PlayerStateListener : MonoBehaviour
06 {
07 … //省略
08 public void hitDeathTrigger()
09 {
10 onStateChange(PlayerStateController.playerStates.kill);
11 }
12 }
從方法的定義中可知,它所實現的功能是,修改精靈當前的狀態爲Kill。
(5)繼續爲腳本PlayerStateListener添加代碼,用於實現當精靈處於死亡和重生狀態時,精靈應有的動做,或者說行爲,部分腳本PlayerStateListener的代碼以下:
01 using UnityEngine;
02 using System.Collections;
03
04 [RequireComponent(typeof(Animator))]
05 public class PlayerStateListener : MonoBehaviour
06 {
07 //公有屬性
08 public float playerWalkSpeed = 3f; //表示精靈移動的速度
09 public GameObject playerRespawnPoint = null; //表示重生的點
10 //私有屬性
11 private Animator playerAnimator = null; //表示對象上的Animator組件
12 … //省略
13 //用於檢測當前所處的動畫狀態,在不一樣的狀態下將表現出不一樣的行爲
14 void onStateCycle()
15 {
16 //表示當前對象的大小
17 Vector3 localScale = transform.localScale;
18 //判斷當前處於何種狀態
19 switch(currentState)
20 {
21 … //省略
22 case PlayerStateController.playerStates.kill:
23 onStateChange(PlayerStateController.playerStates.resurrect);
24 break;
25
26 case PlayerStateController.playerStates.resurrect:
27 onStateChange(PlayerStateController.playerStates.idle);
28 break;
29 }
30 }
31 //當角色的狀態發生改變的時候,調用此函數
32 public void onStateChange(PlayerStateController.playerStates newState)
33 {
34 //若是狀態沒有發生變化,則無需改變狀態
35 if(newState == currentState)
36 return;
37 //判斷精靈可否由當前的動畫狀態,直接轉換爲另外一個動畫狀態
38 if(!checkForValidStatePair(newState))
39 return;
40 //經過修改Parameter中Walking的值,修改精靈當前的狀態
41 switch(newState)
42 {
43 … //省略
44 case PlayerStateController.playerStates.kill:
45 break;
46 //讓精靈在場景重生對象的位置出現
47 case PlayerStateController.playerStates.resurrect:
48 transform.position = playerRespawnPoint.transform.position;
49 transform.rotation = Quaternion.identity;
50
51 break;
52 }
53 //記錄角色當前的狀態
54 currentState = newState;
55 }
56
57 //用於確認當前的動畫狀態可否直接轉換爲另外一動畫狀態的函數
58 bool checkForValidStatePair(PlayerStateController.playerStates newState)
59 {
60 bool returnVal = false;
61
62 //比較兩種動畫狀態
63 switch(currentState)
64 {
65 … //省略
66 //精靈的kill狀態只能轉換爲resurrect狀態
67 case PlayerStateController.playerStates.kill:
68 if(newState == PlayerStateController.playerStates.resurrect)
69 returnVal = true;
70 else
71 returnVal = false;
72 break;
73 //精靈的resurrect狀態只能轉換爲idle狀態
74 case PlayerStateController.playerStates. resurrect :
75 if(newState == PlayerStateController.playerStates.idle)
76 returnVal = true;
77 else
78 returnVal = false;
79 break;
80 }
81 return returnVal;
82 }
83 public void hitDeathTrigger()
84 {
85 onStateChange(PlayerStateController.playerStates.kill);
86 }
87 }
對於此腳本,有如下幾點須要說明:
q 腳本09行,添加了一個公有屬性,用於表示遊戲場景裏Player Respawn Point對象的位置。這個屬性的值須要在Inspector視圖裏設置,如圖2-9所示。
圖2-9 設置Player State Listener腳本組件裏的Player Respawn Point屬性值
q 腳本14行,方法onStateCycle()裏添加的代碼,說明當精靈進入到kill狀態之後,接着會進入resurrect狀態;而進入resurrect狀態的精靈會接着進入idle狀態;
q 腳本32行,方法onStateChange()裏添加的代碼,說明當精靈處於resurrect狀態時,精靈將會出如今重生點的位置;
q 腳本58行,方法checkForValidStatePair()裏添加的代碼,說明處於kill狀態的精靈只能轉換爲resurrect狀態;而處於resurrect狀態的精靈只能轉換爲idle狀態;
(6)爲腳本CameraController添加處理精靈kill和resurrect狀態的代碼,以下:
01 using UnityEngine;
02 using System.Collections;
03
04 public class CameraController : MonoBehaviour
05 {
06 … //省略
07 void onStateCycle()
08 {
09 switch(currentPlayerState)
10 {
11 … //省略
12 case PlayerStateController.playerStates.kill:
13 trackPlayer();
14 break;
15 case PlayerStateController.playerStates.resurrect:
16 trackPlayer();
17 break;
18 }
19 }
20 }
(7)運行遊戲,控制精靈移動至地面外,精靈在下落的過程當中與Death Trigger發生接觸,精靈死亡;很快的,精靈會在Player Respawn Point對象的位置處重生,如圖2-10所示。
圖2-10 精靈的死亡和重生
本文選自:Unity 2D遊戲開發快速入門大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!