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

- 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游戏开发教程之精灵的死亡和重生的更多相关文章
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- Unity 2D游戏开发教程之摄像头追踪功能
Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...
- Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...
- Unity 2D游戏开发教程之2D游戏的运行效果
Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问 ...
- Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏
Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏 即使是如今,非常多初学游戏开发的同学.在谈到Unity的时候.依旧会觉得Unity仅仅能用于制作3D游戏的. 实际上.Unity在2013 ...
- Unity MMORPG游戏开发教程(一)——初识Unity
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以C#为介绍语言,基于Unity2017.4.x. 一.环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己 ...
- 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结
前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...
随机推荐
- iOS程序启动原理---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- Metasploit 进阶
本文是"T00LS Metasploit(第二季)"的文档版,是个人在观看视频动手操作的一个记录,仅供学习.文中会介绍Metasploit的一些基本使用:主要包括远程代码执行.MI ...
- 25、Python垃圾回收机制?
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- webgote的例子(6)SQL注入(盲注)
SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候 ...
- struct msghdr和struct cmsghdr【转载】
理解struct msghdr当我第一次看到他时,他看上去似乎是一个需要创建的巨大的结构.但是不要怕.其结构定义如下:struct msghdr { void *msg_name ...
- 64_p2
perl-Class-XSAccessor-1.19-10.fc26.x86_64.rpm 12-Feb-2017 15:12 48098 perl-Clipboard-0.13-16.fc26.no ...
- 012 public等关键字可见性
public: 具有最大的访问权限,可以访问任何一个在classpath下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. protected: 主要的作用就是用来保护子 ...
- Python下urllib2应用
#coding=utf-8 import urllib,urllib2 url = 'http://www.xxx.com' values = {'wd' : 'python', 'language' ...
- 服务号使用微信网页授权(H5应用等)
获取授权准备 AppId 服务号已经认证且获取到响应接口权限 设置网页授权域名 公众号设置 - 功能设置 - 网页授权域名.注意事项: 回调页面域名或路径需使用字母.数字及"-"的 ...
- 未找到与约束 ContractName Microsoft.VisualStudio.Utilitues.IContentTypeRegistryService......
1.问题提出 用VS 2013 with Update5 开发项目,点击项目中的文件,发现打不开,抛出如下的错误. 错误提示: 未找到与约束 ContractName Microsoft.Visual ...