8 子弹碰撞处理

为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs

子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁.

void Start () {

    Destroy (gameObject, 2); // 过2秒子弹销毁

}

碰到子弹我们这里使用OnTriggerEnter,要想这个发生首先要确保Shell预设体里面Collider的Is Trigger已经被选中了.

 
image

然后在OnTriggerEnter里面我们检测在一定范围之内的坦克有哪些.

private float radius = 5f; // 爆炸范围

public LayerMask mask;

我们需要指定Tank属于哪个LayerMask

 
image

将Shell.cs挂载到Shell预设体上,设置相同的LayerMask

 
image

然后我们使用Physics.OverlapSphere就可以找到以子弹为中心,radius范围之内的所有坦克

Collider[] colliders = Physics.OverlapSphere( transform.position, radius, mask);

然后遍历所有坦克,根据两者之间的距离和最大伤害值100计算坦克所受伤害

Health health = colliders [i].GetComponent<Health> (); // 找到Health组件

        float damage = Vector3.Distance (transform.position, colliders [i].transform.position) / 5 * 100; // 根据实际距离按比例计算伤害值

        if (health) health.TakeDamage (damage); // 坦克承受伤害

另外一个就是为坦克添加被炸开的效果

Rigidbody rb = colliders [i].GetComponent<Rigidbody> (); // 刚体组件

        if( rb ) rb.AddExplosionForce (1000f, transform.position, radius); // 坦克被炸开

最后是子弹炸毁效果和音效

private ParticleSystem ps; // 爆炸效果

private AudioSource audioSource; // 声源

在Start里面获取ps和audioSource

ps = GetComponentInChildren <ParticleSystem> ();

    audioSource = GetComponent<AudioSource> ();

然后在OnTriggerEnter最后播放爆炸效果,爆炸运行,销毁gameObject

ps.transform.parent = null; // 将爆炸效果从Shell里面移出

    ps.Play (); // 播放爆炸效果

    audioSource.Play (); // 播放爆炸音效

    Destroy (ps.gameObject, ps.duration); // 爆炸效果播放完毕之后移出爆炸效果的gameObject

    Destroy (gameObject); // 移出Shell的gameObject

最终版本代码为:Shell.cs

 
image
 

using UnityEngine;

using System.Collections;

public class Shell : MonoBehaviour {

private float radius = 5f; // 爆炸范围

public LayerMask mask; // tank

private ParticleSystem ps; // 爆炸效果

private AudioSource audioSource; // 声源

// Use this for initialization

void Start () {

    Destroy (gameObject, 2); // 过2秒子弹销毁

    ps = GetComponentInChildren <ParticleSystem> (); // 获取子对象的ParticleSystem

    audioSource = GetComponent<AudioSource> (); // 获取音源

}

// Update is called once per frame

void OnTriggerEnter ( Collider other) {

    Collider[] colliders = Physics.OverlapSphere( transform.position, radius, mask); // radius范围内所有坦克

    for (int i = 0; i < colliders.Length; i++) { // 遍历所有坦克

        Health health = colliders [i].GetComponent<Health> (); // 找到Health组件

        float damage = Vector3.Distance (transform.position, colliders [i].transform.position) / 5 * 100; // 根据实际距离按比例计算伤害值

        if (health) health.TakeDamage (damage); // 坦克承受伤害

        Rigidbody rb = colliders [i].GetComponent<Rigidbody> (); // 刚体组件

        if( rb ) rb.AddExplosionForce (1000f, transform.position, radius); // 坦克被炸开

    }

    ps.transform.parent = null; // 将爆炸效果从Shell里面移出

    ps.Play (); // 播放爆炸效果

    audioSource.Play (); // 播放爆炸音效

    Destroy (ps.gameObject, ps.duration); // 爆炸效果播放完毕之后移出爆炸效果的gameObject

    Destroy (gameObject); // 移出Shell的gameObject

}

}

---------------------------我是目录分割线---------------------------

《杜增强讲Unity之Tanks坦克大战》1-准备工作

《杜增强讲Unity之Tanks坦克大战》2-场景设置

《杜增强讲Unity之Tanks坦克大战》3-添加坦克

《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

《杜增强讲Unity之Tanks坦克大战》5-子弹

《杜增强讲Unity之Tanks坦克大战》6-发射子弹

《杜增强讲Unity之Tanks坦克大战》7-坦克血条

《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理

《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力

《杜增强讲Unity之Tanks坦克大战》10-相机控制

《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

---------------------------我是目录分割线---------------------------

《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理的更多相关文章

  1. 《杜增强讲Unity之Tanks坦克大战》10-相机控制

    10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内.   image 在Hierarchy点击右键   image 点击 Create Empty,生成空对象,改名 ...

  2. 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

    11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字   image 设置GameMgr   image 11.2 游戏整体流程 下面Gam ...

  3. 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力

    9 发射子弹时蓄力 实现效果如下   image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...

  4. 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

    4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览   image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里 ...

  5. 《杜增强讲Unity之Tanks坦克大战》1-准备工作

    0.案例介绍 0.1开始界面   点击Play Now 进入游戏界面   左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火   右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...

  6. 《杜增强讲Unity之Tanks坦克大战》2-场景设置

    2  场景设置 2.1 本节效果预览   2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹   Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...

  7. 《杜增强讲Unity之Tanks坦克大战》3-添加坦克

    3 添加坦克 3.1 本节效果预览   3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面.   3.3 添加坦克模型 在Model文件夹下面找到Tank模型   将Tank ...

  8. 《杜增强讲Unity之Tanks坦克大战》5-子弹

    5 子弹 本节的任务是创建子弹的Prefab   image 首先从Model/Shell找到子弹的模型,拖入Hierarchy中,添加刚体组件,所有属性默认值. 添加Capsule Collider ...

  9. 《杜增强讲Unity之Tanks坦克大战》6-发射子弹

    6 发射子弹 本节完成发射子弹的功能,最终代码如下:   image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...

  10. 《杜增强讲Unity之Tanks坦克大战》7-坦克血条

    7 坦克血条 点击菜单GameObject->UI->Slider创建Slider   选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...

随机推荐

  1. 【转载】uWSGI配置翻译

    英文原版: http://uwsgi-docs.readthedocs.io/en/latest/Options.html 转载地址: http://www.cnblogs.com/zhouej/ar ...

  2. BZOJ 3171 循环格 最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3171 题目大意: 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元 ...

  3. Java多线程和并发基础面试总结

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.收藏起来,希望给予即将找 ...

  4. virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings

    Machine Settings 配置命名空间:config.vm config.vm的设置将修改vagrant管理的机器的配置 Available Settings可用设置 config.vm.ba ...

  5. $NOIp$前的日常

    嗯,一想到没准今年\(NOIp\)之后就要退役了,觉得没准这篇博客就是我OI史上的绝唱了-- \(hhh\),希望不会这样. \(12.4\) 退役了是真的233-- 居然感到一身轻松啊qwqwq \ ...

  6. C语言程序设计I—第一周教学

    这是在修改人才培养方案后第一次上C语言程序设计课程,本课程由原来的1学期80课时(周学时6)修改为2学期48(周学时4)+32(周学时2)课时的模式,开课学期也由一年二期改为大一整学年,当时修改的主要 ...

  7. Linux Shell常用技巧(五)

    十一.  awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&quo ...

  8. Lambda 表达式的示例

    本文中的过程演示如何使用 lambda 表达式. 有关 lambda 表达式的概述,请参见 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的更多信息,请参见 Lambda 表达式 ...

  9. Nginx Location模块

    相关知识点:URI:统一资源标识符,是一个用于标识某一互联网资源名称的字符串,该种标识允许用户对任何的资源通过特定的协议进行交互操作.URL:统一资源定位符,由三部分组成(1)http://协议 (2 ...

  10. 二、Delphi10.3在不下载文件情况下读取网站文件大小等信息

    一.上源码 uses TxHttp, Classes, TxCommon, Frm_WebTool, SysUtils; var m_Url: string; m_Http: TTxHttp; m_P ...