
4.2 碰撞检测
通过前面动画编排与条件设置,使得气球具备了动画效果,但是和钉子阵、橘子皮并没有交互。本节将分别给这些对象添加碰撞体,并编写相应的代码,控制气球移动碰撞钉子阵引发其晃动,之后碰撞橘子皮触发爆炸动画,从而完成气球漫游的全过程。
4.2.1 添加碰撞器和触发器
(1)为气球对象添加Rigidbody 2D。首先选中Hierarchy面板的Balloon对象,选择菜单栏中Component →Physics2D→Rigidbody 2D命令,如图4-35所示。或者在Inspector面板下方单击Add Component按钮,添加Rigidbody 2D,所有设置采用默认值。

图4-35 添加Rigidbody 2D
(2)分别为气球、钉子阵、橘子皮三个游戏对象添加Box Collider 2D碰撞器。选中Hierarchy面板的游戏对象,单击上方Component菜单栏,选择菜单栏中的Component→Physics2D→Box Collider2D命令,如图4-36所示,添加碰撞检测器。或者在Inspector面板下方单击Add Component按钮,添加碰撞检测器Box Collider 2D。

图4-36 添加Box Collider 2D碰撞器
(3)将气球和钉子阵之间的碰撞设置为碰撞器,将气球和橘子皮之间的碰撞设置为触发器。设置触发器的操作方法是:首先选择Hierarchy面板中的橘子皮对象,在右边的Inspector面板中找到Box Collider 2D组件,勾选Is Trigger复选框,即可将碰撞器改为触发器,如图4-37所示。

图4-37 勾选Is Trigger复选框
(4)选择Hierarchy面板中的Balloon对象,在右边Inspector面板中找到Box Collider 2D属性,单击Edit Collider按钮,如图4-38所示。

图4-38 单击Edit Collider按钮
(5)这时在场景中就可以对Balloon对象的碰撞检测器进行修改,将其调整到一个合适的大小,如图4-39所示。采用同样的方法对其他对象的碰撞检测器进行修改。

图4-39 修改碰撞器
4.2.2 编写气球控制代码
步骤1 创建脚本文件夹
在Assets中创建一个新的子文件夹,命名为Script。在Script文件夹中再创建两个脚本文件,分别命名为Balloon_Control和Tool_Control。
步骤2 编写气球(Balloon_Control)控制代码
这部分代码将实现按下左、右方向键控制气球左右移动,按下向上方向键控制气球弹起。若按下的是向左方向键,气球可以旋转180°,让气球调转方向。若碰到了钉子阵,气球晃动。碰到橘子皮,气球爆炸。具体代码如下。


【程序代码说明】
第6行:声明一个Animator类对象。
第7~8行:声明Player对象和balloon_explode对象。
第9行:声明bool类型的变量balloon_shake,用于动画切换。
第10行:声明一个float变量来存储角色移动速度。
第13行:获取玩家对象本身。
第14行:获取Animator组件。
第15行:设置移动速度为10。
第19行:为动画控制器变量balloon_shake设置值。
第20~24行:判断是否按下了向左的方向键,对象水平旋转180°,向左边方向移动。
第25~29行:判断是否按下了向右的方向键,对象旋转值归零,对象向右边方向移动。
第30~33行:判断是否按下了向上的方向键,对象向上移动。
第35~40行:如果碰到钉子阵,设置balloon_shake=true,即播放动画。
第41~47行:如果离开钉子阵,设置balloon_shake=false。
第48~55行:如果碰到橘子皮,销毁对象,气球爆炸。进入触发器时会调用OnTriggerStay2D函数,进入碰撞器时会调用OnCollisionEnter2D函数。
步骤3 为Balloon对象添加脚本组件
将创建的脚本添加到Hierarchy面板的Balloon对象上。运行程序进行测试,气球已经能够移动。碰到钉子阵时会被阻止,按下向上的方向键气球会被弹起,落入钉子阵后,气球出现晃动。碰到橘子皮后气球爆炸。但是气球爆炸的动画一直显示在屏幕上,也没有消失,这些问题将在下面解决。
4.2.3 编写爆炸控制代码
步骤1 编写爆炸控制代码(Tool_Control)

【程序代码说明】
第5~8行:OnTriggerStay2D函数用于判断是否有碰撞体位于碰撞器内,如果有,过1秒钟后对象销毁。
步骤2 为ExplodeBalloon对象添加脚本组件
将创建的脚本添加到ExplodeBalloon对象上。现在运行程序进行测试,发现爆炸过程也能消失了。