Unity 2D遊戲開發教程之精靈的死亡和重生

Unity 2D遊戲開發教程之精靈的死亡和重生

精靈的死亡和重生

目前爲止,遊戲項目裏的精靈只有IdleWalking這兩種狀態。也就是說,不管精靈在遊戲裏作什麼,它都不會進入其它的狀態,如死亡。因而咱們發現遊戲裏的精靈,即便是跳入「萬丈深淵」,也依然存活,顯然這種遊戲邏輯沒法讓人接受。所以,本節就來講明爲精靈添加死亡和重生這兩種狀態的方法,並使用腳本實現這兩種狀態的邏輯。具體的實現步驟以下: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                       //經過修改ParameterWalking的值,修改精靈當前的狀態

  • 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添加處理精靈killresurrect狀態的代碼,以下:

  • 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人!

相關文章
相關標籤/搜索