zoukankan      html  css  js  c++  java
  • Unity 2D游戏开发教程之精灵的死亡和重生

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

  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/daxueba-ITdaren/p/4788219.html
Copyright © 2011-2022 走看看