Unity 2D游戏开发教程之精灵的死亡和重生
< 返回列表时间: 2015-09-07来源:OSCHINA
Unity 2D游戏开发教程之精灵的死亡和重生
精灵的死亡和重生
目前为止,游戏项目里的精灵只有 Idle 和 Walking 这两种状态。也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡。于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受。因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑。具体的实现步骤如下:
( 1 )在 Hierarchy 视图里,新建一个 Empty 对象,并命名为 Death Trigger ,设置其 Position 属性为 (0,0,0) 。然后为此对象添加 Box Collider 2D 组件,并设置此组件的下列属性,如图 2-6 所示。 q 选中 Is Trigger 属性; q Size : (20,1) ; q Center : (0,-2.5) ;


图 2-6 对象上 Box Collider 2D 组件的属性设置
回看此时的 Scene 视图,可知此步操作添加了一个绿色线框的矩形,如图 2-7 所示。我们希望当精灵与此矩形发生接触时,精灵会死亡。

图 2-7 表示 Empty 对象范围的矩形框
( 2 )当精灵死亡以后,要想继续游戏,精灵必须在指定的位置重生才行,而且这个位置在精灵对象重生以后,不会让精灵被动的接触到 Death Trigger 对象。在 Hierarchy 视图里,再新建一个 Empty 对象,并命名为 Player Respawn Point ,设置其 Position 属性为 (0,1,5,0) ,也就是说重生的点位于地面正上方的指定位置处,如图 2-8 所示。

图 2-8 设置精灵重生点的位置
( 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人!

热门排行