您的位置:首页 > 其它

Space Shooter之子弹和敌人碰撞检测、爆炸特效以及敌人的运动

2016-04-24 12:39 751 查看

原始状态



飞船现在能够发射子弹,以及移动等,但是可以看到子弹碰撞到陨石时,并没有发生爆炸或者销毁等等现象,因为我们没有添加任何触发和碰撞的脚本。下面进行设置:

碰撞检测前的准备工作

在添加碰撞检测之前,需要对飞船及陨石添加Rigidbody、collider等,由于本例子中的飞船和陨石是在一个平面上,因此需要把刚体的Use gravity勾选掉,使之不受重力的影响,并依然可以进行相关的物理操作。下面是飞船和陨石的相关参数设置,注意:飞船和陨石都不需要Use gravity,由于这里我们设置他们为触发碰撞,所以IsTrigger应该勾选。





添加碰撞检测的脚本

在陨石上添加脚本DestoryByContact.cs,这个脚本该怎么写?我们要实现的功能是:子弹和陨石发生物理碰撞,就销毁陨石和子弹。我们使用的是触发器碰撞,因此可在脚本中写如下代码:
using UnityEngine;
using System.Collections;

public class DestoryByContact : MonoBehaviour {
void OnTriggerEnter(Collider other) {
Destroy(this.gameObject);  // 摧毁陨石
Destroy(other.gameObject); // 摧毁子弹
}
}


但是写完这段代码后,运行Unity,会发现如下图情况,是的还没发射子弹,陨石怎么就没了?



这是因为我们之前设置了子弹飞出Boundary的BoxCollider后就会销毁的子弹的碰撞区域,而通过在OnTriggerEnter(Collider other)函数中打印日志other.name,知碰撞的是是Boundary,陨石一致在之前的Boundary中,因此刚运行Unity就会触发Destroy(this.gameObject); // 摧毁陨石和Boundary。为让陨石无视Boundary的碰撞,通常做法是添加Tag ,在Boundary上添加Tag为boundary,用Tag来区别陨石和子弹与Boundary的碰撞。修改后的代码如下:
using UnityEngine;
using System.Collections;

public class DestoryByContact : MonoBehaviour {
void OnTriggerEnter(Collider other) {
// 如果碰撞的是Boundary则返回
if (other.tag == "boundary")
return;
Destroy(this.gameObject);  // 摧毁陨石
Destroy(other.gameObject); // 摧毁子弹
}
}


修改后的效果即为想要的效果,如下图所示:



添加碰撞摧毁后的爆炸效果

上面虽然实现了想要的功能,但是画面未免有点单调,下面给碰撞检测后的摧毁效果添加一些特效。在官方资源包里面有行星爆炸的特效,想想怎么使用这些爆炸特效?哈哈之前说成陨石了,其实都差不多,都是敌人。

打开DestoryByContact.cs这个脚本,之前我们添加了碰撞检测以及碰撞后的摧毁效果,下面只需在摧毁的时候实例化这个爆炸特效即可,代码清单如下:
using UnityEngine;
using System.Collections;

public class DestoryByContact : MonoBehaviour {
// 存放爆炸特效对象的变量
public GameObject explosion;
void OnTriggerEnter(Collider other) {
// 如果碰撞的是Boundary则返回
if (other.tag == "boundary")
return;

//  实例化爆炸特效
Instantiate(explosion, transform.position, transform.rotation);
Destroy(this.gameObject);  // 摧毁陨石
Destroy(other.gameObject); // 摧毁子弹
}
}


因为我们public GameObject explosion;是public变量,因此别忘了在Inspector中给该变量赋值,即把explosion_asteroid拖到explosion上。



运行Unity,得到如下我们想要的效果,但是用飞船撞击陨石也会像下面一样的爆炸特效,一般效果是不一样的,下面再对飞船撞击陨石进行特效制作。



设置飞船和陨石碰撞的爆炸特效

其实很简单,只需要在脚本中添加一个判断,如果子弹和陨石碰撞是一种爆炸效果,如果飞船和陨石碰撞就是另一种爆炸效果。代码如下:
using UnityEngine;
using System.Collections;

public class DestoryByContact : MonoBehaviour {
// 存放爆炸特效对象的变量
public GameObject explosion;

// 存放飞船和陨石相撞的爆炸特效
public GameObject playerExplosion;

void OnTriggerEnter(Collider other) {
// 如果碰撞的是Boundary则返回
if (other.tag == "boundary")
return;

// 先为飞船添加Tag
if(other.tag == "player"){
Instantiate(playerExplosion, transform.position, transform.rotation);
}

//  实例化爆炸特效
Instantiate(explosion, transform.position, transform.rotation);
Destroy(this.gameObject);  // 摧毁陨石
Destroy(other.gameObject); // 摧毁子弹或飞船
}
}


注意:公有变量的赋值和上面一样,不过要使用explosion_player这个预设,爆炸效果如下图:哈哈,效果差不过,特效做的太像了吧......



陨石的运动

这里我把陨石和行星视为同一个物体。怎么让陨石运动呢?之前写过子弹运动的脚本,因此可以把子弹运动的脚本Mover拖拽到陨石GameObject上面,并且把运动的speed改为-5,这样陨石就会和子弹运动的方向相反了。效果如下图。最后,把创建好的陨石拖到Prefabs文件夹中,存放陨石的预设,这样在接下来的游戏中就可以直接使用陨石预设了。最后的最后,把Hierarchy中的陨石GameObject删除。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: