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

原始状态


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

碰撞检测前的准备工作

在添加碰撞检测之前,需要对飞船及陨石添加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删除。






展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值