2.7.2 触发碰撞

我们已经为主角、子弹和敌人添加了碰撞体,但还是看不到任何互动效果,我们将要为它们分别指定一个Tag标识,然后添加触发碰撞事件的代码。
 
在菜单栏选择【Edit】→【Project Settings】→【Tags】,在Size中输入2,创建2个新的Tag,名为PlayerRocket和Enemy,如图2-25所示。
在Project窗口选择敌人的Prefab,在Inspector窗口设置Tag为Enemy,如图2-26所示。
选择子弹的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所示。
修改Enemy.cs的OnTriggerEnter函数。
  if (other.tag.CompareTo("bound") == 0)
  {
        m_life = 0;
        Destroy(this.gameObject);
  }
 
现在,敌人在飞出屏幕外后会自行销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值