我们已经为主角、子弹和敌人添加了碰撞体,但还是看不到任何互动效果,我们将要为它们分别指定一个Tag标识,然后添加触发碰撞事件的代码。
在菜单栏选择【Edit】→【Project Settings】→【Tags】,在Size中输入2,创建2个新的Tag,名为PlayerRocket和Enemy,如图2-25所示。
![](http://www.2cto.com/uploadfile/2014/1015/20141015022938461.png)
在Project窗口选择敌人的Prefab,在Inspector窗口设置Tag为Enemy,如图2-26所示。
![](http://www.2cto.com/uploadfile/2014/1015/20141015022951343.png)
选择子弹的Prefab,设置它的Tag为PlayerRocket。
选择主角,设置它的Tag为Player,这个Tag是Unity预设在工程内的。
打开Enemy.cs脚本,添加一个生命属性:
public float m_life = 10;
在Enemy脚本中添加一个OnTriggerEnter函数,这是一个派生自MonoBehaviour的函数,在碰撞体互相接触时会被触发,如下所示:
void OnTriggerEnter(Collider other) // 派生自MonoBehaviour 的函数,在碰撞体互相接触的时候会被触发。
{
if(other.tag.CompareTo("PlayerRocket") == 0)
//other.tag.CompareTo("PlayerRocket") == 0 是用来比较字符串, 判断遇到的碰撞体是否是主角的子弹
{
Rocket rocket = other.GetComponent<Rocket>(); // 获得了对方碰撞体的Rocket脚本组件。
if(rocket != null)
{
m_life -= rocket.m_power;
if(m_life <= 0)
{
GameManager.Instance.AddScore(m_point); // 当敌人被消灭时我们会获得一定分数:
Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);
// Quaternion.identity 同一性旋转(只读)。该四元数,相当于"无旋转":这个物体完全对齐于世界或父轴;表示该生成的克隆不旋转
Destroy(this.gameObject);
}
}
}
else if(other.tag.CompareTo("Player") == 0) // 判断是否与主角相撞,
{
m_life = 0;
Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);
// Quaternion.identity 同一性旋转(只读)。该四元数,相当于"无旋转":这个物体完全对齐于世界或父轴;表示该生成的克隆不旋转
Destroy(this.gameObject);
}
if(other.tag.CompareTo("bound") == 0)
{
m_life = 0;
Destroy(this.gameObject);
}
}
打开Rocket.cs脚本,也添加一个OnTriggerEnter函数,它的作用很简单,如果子弹撞击到敌人,销毁自身。
void OnTriggerEnter(Collider other)
{
if (other.tag.CompareTo("Enemy")!=0)
return;
Destroy(this.gameObject);
}
打开Player.cs脚本,添加一个生命属性,然后也添加一个OnTriggerEnter函数,主角飞船与任何己方子弹以外的碰撞体相撞都会损失一点生命,生命为零时销毁自身,如下所示:
public float m_life = 3;
void OnTriggerEnter(Collider other)
{
if (other.tag.CompareTo("PlayerRocket") != 0)
{
m_life -= 1;
if (m_life <= 0)
{
Destroy(this.gameObject);
}
}
}
运行游戏,我们可以发射子弹消灭敌人,主角也可以被敌人撞击损坏,游戏已经有点模样了,但如果敌人不能被消灭则会一直存活下去,解决的方法很简单,只需要在屏幕下方放一个空的碰撞体,当敌人与它碰撞时使它消失即可。
创建一个空游戏体,为它添加并指定一个名为“bound”的tag和物理
组件,将它置于屏幕下方,如图2-27所示。
![](http://www.2cto.com/uploadfile/2014/1015/20141015023011786.png)
修改Enemy.cs的OnTriggerEnter函数。
if (other.tag.CompareTo("bound") == 0)
{
m_life = 0;
Destroy(this.gameObject);
}
现在,敌人在飞出屏幕外后会自行销毁。