说起炸弹超人,相信很多朋友都玩过类似的游戏,其中最为人熟知的莫过于《泡泡堂》。该类型游戏需要玩家在地图中一边跑动一边放置炸弹,同时还要躲避敌方炸弹保护自己。最初的炸弹超人游戏都是2D的,今天这篇文章将教大家在Unity中实现一款3D的炸弹超人游戏。
温馨提示,本教程需要大家了解Unity的基本操作与脚本概念。
下载初始项目资源(请回复本帖哦~):
davinci8,如果您要查看本帖隐藏内容请回复
准备工作
将项目初始资源导入Unity项目,资源目录如下:
其中分别包含要用于游戏的动画、材质、模型、背景音乐、物理材质、预制件、场景、脚本、音效及图片资源。
放置炸弹
打开项目中的Game场景并运行。
可以通过WASD键或方向键来操作所有角色进行移动。下面来让角色可以放置炸弹。角色1(红色)通过按下空格键来放置炸弹,角色2(蓝色)则通过按下回车键进行同样的操作。
打开Player脚本,该脚本负责角色所有的移动及动画逻辑。找到DropBomb函数,添加代码如下:
[C#] 纯文本查看 复制代码 /// <summary> /// Drops a bomb beneath the player /// </summary> private void DropBomb() { if (bombPrefab) { //Check if bomb prefab is assigned first // Create new bomb and snap it to a tile Instantiate(bombPrefab, new Vector3(Mathf.RoundToInt(myTransform.position.x), bombPrefab.transform.position.y, Mathf.RoundToInt(myTransform.position.z)), bombPrefab.transform.rotation); } }
其中RoundToInt函数用于对炸弹的坐标参数四舍五入,以避免炸弹放置位置偏离出地块中心。
运行场景,效果如下:
Bomb代码中定义的LayerMask用于剔除射线对地块的检测,这里还需要在检视面板中编辑层,并新增用户层命名为“Blocks”,然后将层级视图中Blocks游戏对象的Layer设置为“Blocks”。
更改Blocks对象的层级时会跳出提示框,询问是否更改子节点,选择是即可:
然后选中Bomb对象,在检视面板中将Bomb脚本的Level Mask设为“Blocks”:
连锁反应
如果炸弹炸到了另一个炸弹,那么被炸到的炸弹也会爆炸。Bomb脚本中的OnTriggerEnter
函数是MonoBehaviour预定义的函数,会在触发器与Rigidbody碰撞之前调用。这里OnTriggerEnter会检测被碰撞的炸弹是否是被炸弹特效所碰撞,如果是,则该炸弹也要爆炸。
现在运行场景,效果如下:
判定游戏结果
打开Player脚本,添加下面的代码:
[C#] 纯文本查看 复制代码 //Manager public GlobalStateManager GlobalManager; //Player parameters [Range(1, 2)] //Enables a nifty slider in the editor public int playerNumber = 1; //Indicates what player this is: P1 or P2 public float moveSpeed = 5f; public bool canDropBombs = true; //Can the player drop bombs? public bool canMove = true; //Can the player move? public bool dead = false; //Is this player dead?
其中GlobalManager是GlobalStateManager脚本的引用,该脚本用于通知玩家获胜或死亡的消息。dead则用于标志玩家是否死亡。
更改OnTriggerEnter函数代码如下:
[C#] 纯文本查看 复制代码 public void OnTriggerEnter(Collider other) { if (!dead other.CompareTag(Explosion)) { //Not dead hit by explosion Debug.Log(P + playerNumber + hit by explosion!); dead = true; GlobalManager.PlayerDied(playerNumber); //Notify global state manager that this player died Destroy(gameObject); } }
该函数作用为设置dead变量来通知玩家死亡,并告知全局状态管理器玩家的死亡信息,然后销毁玩家对象。
在检视面板中选中两个玩家对象,将Global State Manager游戏对象赋值给Player脚本的Global Manger字段。
再次运行场景,效果如下:
打开GlobalStateManager脚本,添加以下代码:
[C#] 纯文本查看 复制代码 public List<GameObject> Players = new List<GameObject>(); private int deadPlayers = 0; private int deadPlayerNumber = -1; public void PlayerDied(int playerNumber) { deadPlayers++; if (deadPlayers == 1) { deadPlayerNumber = playerNumber; Invoke(CheckPlayersDeath, .3f); } }
其中deadPlayers表示死亡的玩家数量,deadPlayerNumber则用于记录死亡玩家的编号。PlayerDied函数用于添加死亡玩家,并设置deadPlayerNumber属性,在0.3秒后检测另一位玩家是否也死亡。
然后在脚本中添加CheckPlayersDeath函数,代码如下:
[C#] 纯文本查看 复制代码 void CheckPlayersDeath() { if (deadPlayers == 1) { //Single dead player, hes the winner if (deadPlayerNumber == 1) { //P1 dead, P2 is the winner Debug.Log(Player 2 is the winner!); } else { //P2 dead, P1 is the winner Debug.Log(Player 1 is the winner!); } } else { //Multiple dead players, its a draw Debug.Log(The game ended in a draw!); } }
以上代码用于判断哪位玩家获得胜利,如果两位玩家均死亡,则打成平局。
运行场景,效果如下:
总结
到此本篇教程就结束了,大家还可以在此基础上对该项目进行扩展,例如添加“推箱子”功能,将位于自己脚边的炸弹推给敌方,或是限制能够放置的炸弹数量,添加快速重新开始游戏的界面,设置可以被炸弹炸毁的障碍物,设置一些道具用于获得炸弹或者增加生命值,还可以增加多人对战模式与朋友一起变身炸弹超人等等。大家都来发挥自己的创意吧!
下载完整示例工程(请回复本帖哦~):
davinci8,如果您要查看本帖隐藏内容请回复
原文链接:https://www.raywenderlich.com/125559/make-game-like-bomberman
原作者:Eric Van de Kerckhove
转载请注明来自Unity官方中文社区 Unity, 炸弹超人, 泡泡堂, 教程
锐亚教育 锐亚科技 unity unity教程
-
棒(0) 回复 (0)