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

Unity 2D游戏开发教程之精灵的死亡和重生的更多相关文章

  1. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  2. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  3. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

  4. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  5. Unity 2D游戏开发教程之为游戏场景添加多个地面

    Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...

  6. Unity 2D游戏开发教程之2D游戏的运行效果

    Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问 ...

  7. Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏

    Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏 即使是如今,非常多初学游戏开发的同学.在谈到Unity的时候.依旧会觉得Unity仅仅能用于制作3D游戏的. 实际上.Unity在2013 ...

  8. Unity MMORPG游戏开发教程(一)——初识Unity

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以C#为介绍语言,基于Unity2017.4.x. 一.环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己 ...

  9. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

随机推荐

  1. Distributed Systems 分布式系统

    先来扯淡,几天是14年12月31日了,茫茫然,2014就剩最后一天了.这两天国大都放假,我给自己安排了四篇博客欠账,这就是其中的第一篇,简单介绍一些分布式系统的一些概念和设计思想吧.后面三篇分别是Ne ...

  2. Centos7环境下消息队列之ActiveMQ实战

    Activemq介绍 对于消息的传递有两种类型: 一种是点对点的,即一个生产者和一个消费者一一对应: 另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. JMS定义了 ...

  3. 【AtCoder】ARC086 E - Smuggling Marbles

    [题目]E - Smuggling Marbles [题意]给定n+1个点的树(root=0),每个点可以选择放或不放弹珠,每一轮顺序进行以下操作: 1.将根节点0的弹珠加入答案. 2.每个点的弹珠移 ...

  4. Intersection(HDU5120 + 圆交面积)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目: 题意: 求两个圆环相交的面积. 思路: 两个大圆面积交-2×大圆与小圆面积交+两小圆面 ...

  5. Web攻防系列教程之 Cookie注入攻防实战

    摘要:随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQ ...

  6. .ui/qrc文件自动生成.py文件

    前天PL让我们做一个从手机里手机一些数据导出到excel文件里的Tool. 让我们用python去写一个.但是我们都没有学过python..呵呵! 然后昨天看了一些文档.做ui时还需要把图片写入qrc ...

  7. Lucene7.2.1系列(三)查询及高亮

    系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 一 准备 创建项目并添加Maven依赖 <dependenc ...

  8. imperva系统升级遇见的错误(配置文件的导入导出)

    今天心态有点炸了 今天去东兴证券做waf升级.浪费了两天才弄完.把客户都弄得有点急了.好歹原厂的工程师耐心的讲解这才弄完.感谢路哥.... 赶紧总结一下. 事情是这样的.东兴 证券的imperva是v ...

  9. http 之cookie和session

     cookie和session 关于http: 1.http是:无状态.短连接 2.http的请求生命周期:给服务端发送一个请起头,通过域名提取url,通过路由关系匹配,再通过函数+html进行模板加 ...

  10. 64_n3

    nodejs-yamlish-0.0.5-9.fc26.noarch.rpm 11-Feb-2017 16:48 11966 nodejs-yargs-3.2.1-6.fc26.noarch.rpm ...