Unity 2D游戏开发教程之精灵的死亡和重生

Wesley13
• 阅读 553

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);

Unity 2D游戏开发教程之精灵的死亡和重生

图2-6 对象上Box Collider 2D组件的属性设置

回看此时的Scene视图,可知此步操作添加了一个绿色线框的矩形,如图2-7所示。我们希望当精灵与此矩形发生接触时,精灵会死亡。

Unity 2D游戏开发教程之精灵的死亡和重生

图2-7 表示Empty对象范围的矩形框

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

Unity 2D游戏开发教程之精灵的死亡和重生

图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所示。

Unity 2D游戏开发教程之精灵的死亡和重生

图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所示。

Unity 2D游戏开发教程之精灵的死亡和重生

图2-10 精灵的死亡和重生

本文选自:Unity 2D游戏开发快速入门大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏
Unity2D游戏开发快速入门第1章创建一个简单的2D游戏即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的。实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了。例如,提供了一些专用于开发2D游戏的Unit
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之游戏精灵的开火状态
Unity2D游戏开发教程之游戏精灵的开火状态精灵的开火状态“开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力。因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是:(1)导入一个表
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity2D游戏开发教程之为游戏场景添加多个地面为游戏场景添加多个地面显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的。那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面。具体的操作方法是:(1)在Project视图里,新建一个文件夹,命名为Pr
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity2D游戏开发教程之使用脚本实现游戏逻辑使用脚本实现游戏逻辑通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态。但是这其中还有一些问题。例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这