Unity开启篇(二十一) —— 如何使用Unity制作像Bomberman一样的游戏(二)

版本记录

版本号 时间
V1.0 2019.01.31 星期四

前言

Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至WindowsMacWiiiPhoneWebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。网页游戏 坦克英雄和手机游戏王者荣耀都是基于它的开发。
下面我们就一起开启Unity之旅。感兴趣的看下面几篇文章。
1. Unity开启篇(一) —— Unity界面及创建第一个简单的游戏 (一)
2. Unity开启篇(二) —— Unity界面及创建第一个简单的游戏 (二)
3. Unity开启篇(三) —— 一款简单射击游戏示例 (一)
4. Unity开启篇(四) —— 一款简单射击游戏示例 (二)
5. Unity开启篇(五) —— 一款简单射击游戏示例 (三)
6. Unity开启篇(六) —— Unity动画简介 (一)
7. Unity开启篇(七) —— Unity动画简介 (二)
8. Unity开启篇(八) —— Unity声音简介(一)
9. Unity开启篇(九) —— Unity声音简介(二)
10. Unity开启篇(十) —— Unity粒子系统简介(一)
11. Unity开启篇(十一) —— Unity粒子系统简介(二)
12. Unity开启篇(十二) —— Unity脚本简介(一)
13. Unity开启篇(十三) —— Unity脚本简介(二)
14. Unity开启篇(十四) —— Unity UI简介(一)
15. Unity开启篇(十五) —— Unity UI简介(二)
16. Unity开启篇(十六) —— Unity UI简介(三)
17. Unity开启篇(十七) —— Unity UI简介(四)
18. Unity开启篇(十八) —— Unity UI简介(五)
19. Unity开启篇(十九) —— Unity UI简介(六)
20. Unity开启篇(二十) —— 如何使用Unity制作像Bomberman一样的游戏(一)

Chain Reactions

当一枚炸弹的爆炸触及另一枚炸弹时,下一枚炸弹应该爆炸 - 这个特征会带来更具战略性,刺激性和火力的游戏。

幸运的是,这很容易实现。

在代码编辑器中打开Bomb.cs脚本。 在CreateExplosions()下面添加一个名为OnTriggerEnter的新方法:

public void OnTriggerEnter(Collider other) 
{

}

OnTriggerEnterMonoBehaviour中预定义的方法,在触发器碰撞器和刚体撞击时调用。 名为otherCollider参数是进入触发器的GameObject的对撞机。

在这种情况下,您需要检查碰撞对象并在炸弹爆炸时使炸弹爆炸。

首先,你需要知道炸弹是否爆炸了。 爆炸变量需要先声明,所以在levelMask变量声明下添加以下内容:

private bool exploded = false;

OnTriggerEnter()内,添加以下代码段:

if (!exploded && other.CompareTag("Explosion"))
{ // 1 & 2  
  CancelInvoke("Explode"); // 2
  Explode(); // 3
}  

这个片段做了三件事:

  • 1) 检查炸弹没有爆炸。
  • 2) 检查触发器对撞机是否已分配Explosion标签。
  • 3) 通过丢弃炸弹取消已经被称为Explode的调用 - 如果你不这样做,炸弹可能爆炸两次。
  • 4) 爆炸!

现在你有一个变量,但它还没有被改变。 在您禁用MeshRenderer组件后,最合理的设置是在Explode()内部:

...
GetComponent<MeshRenderer>().enabled = false;
exploded = true;        
...  

现在一切都已设置好,因此请保存文件并再次运行场景。 将一些炸弹放在彼此附近并观察会发生什么:

现在你有一些严重破坏性的火力正在进行中。 一次小小的爆炸可以通过触发其他炸弹让你的小游戏世界着火,允许这些酷酷的连锁反应!

最后要做的是处理玩家对爆炸的反应以及游戏如何将反应转化为胜利或平局状态。


Player Death And How To Handle It

在代码编辑器中打开Player.cs脚本。

现在,没有变量来指示玩家是死还是活,所以在脚本的顶部添加一个布尔变量,就在canMove变量的正下方:

public bool dead = false;

此变量用于跟踪玩家是否因爆炸而死亡。

接下来,将其添加到所有其他变量声明之上:

public GlobalStateManager globalManager;

这是对GlobalStateManager的引用,该脚本通知所有玩家死亡并确定哪个玩家获胜。

OnTriggerEnter()内部,已经检查过玩家是否被爆炸击中,但它现在所做的只是将其记录在控制台窗口中。

Debug.Log调用下添加此代码段:

dead = true; // 1
globalManager.PlayerDied(playerNumber); // 2
Destroy(gameObject); // 3  

这段代码执行以下操作:

  • 1) 设置死变量,以便您可以跟踪玩家的死亡。
  • 2) 通知global state manager该玩家已经死亡。
  • 3) 销毁player GameObject

保存此文件并返回Unity编辑器。 您需要将GlobalStateManager链接到两个玩家:

  • hierarchy结构窗口中,选择两个Player GameObjects
  • Global State Manager GameObject拖到其Global Manager插槽中。

再次运行场景并确保其中一个玩家被爆炸消灭。

每一个阻碍爆炸的玩家都会立即死亡。

游戏不知道谁赢了,因为GlobalStateManager不使用它收到的信息。 是时候改变了。

1. Declare the Winner

在代码编辑器中打开GlobalStateManager.cs

要让GlobalStateManager跟踪哪些玩家死亡,您需要两个变量。 在PlayerDied()上方的脚本顶部添加以下内容:

private int deadPlayers = 0;
private int deadPlayerNumber = -1;  

首先,deadPlayers将保留死亡的玩家数量。deadPlayerNumber在第一个玩家死亡时设置,并指示它是哪一个。

现在您已经进行了此设置,您可以添加实际逻辑。 在PlayerDied()中,添加以下代码:

deadPlayers++; // 1

if (deadPlayers == 1) 
{ // 2
    deadPlayerNumber = playerNumber; // 3
    Invoke("CheckPlayersDeath", .3f); // 4
}  

此代码段执行以下操作:

  • 1) 添加一个死玩家。
  • 2) 如果这是第一个死亡的玩家......
  • 3) 它将死玩家编号设置为首先死亡的玩家。
  • 4) 检查其他玩家是否也死了,或者0.3秒后是否只有一点灰尘。

最后一次延迟对于进行平局检查至关重要。 如果你立即检查,你可能不会看到每个人都死了。 0.3秒就足以确定每个人是否都死了。

2. Win, Lose or Draw

你已经到了最后一节了! 在这里你创造了在胜利或平局之间选择的逻辑!

GlobalStateManager脚本中创建一个名为CheckPlayersDeath的新方法:

void CheckPlayersDeath() 
{
  // 1
  if (deadPlayers == 1) 
  { 
    // 2
    if (deadPlayerNumber == 1) 
    { 
      Debug.Log("Player 2 is the winner!");
    // 3
    } 
    else 
    { 
      Debug.Log("Player 1 is the winner!");
    }
     // 4
  } 
  else 
  { 
    Debug.Log("The game ended in a draw!");
  }
}  

这是此方法中不同if语句背后的逻辑:

  • 1) 一名玩家死亡,他是输家。
  • 2) 玩家1死亡,因此玩家2是赢家。
  • 3) 玩家2死亡,所以玩家1是赢家。
  • 4) 两名玩家都死了,所以这是平局。

保存你的代码,然后给游戏一个最后的运行并测试控制台窗口是否读出了哪个玩家赢了或者它最终是否为平局:

强烈建议您继续开发这款游戏 - 通过添加新功能使其成为您自己的游戏! 以下是一些建议:

  • 使炸弹“可推动”,这样你就可以逃离你旁边的炸弹并将它们推向你的对手
  • 限制可以丢弃的炸弹数量
  • 轻松快速重启游戏
  • 添加可被爆炸摧毁的易碎块
  • 创建有趣的powerups
  • 添加生命或获得它们的方式
  • 用于表明玩家获胜的UI元素
  • 找到一种方法,允许更多的玩家

后记

本篇主要讲述了如何使用Unity制作像Bomberman一样的游戏,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容