《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理
8 子弹碰撞处理
为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs
子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁.
void Start () {
Destroy (gameObject, 2); // 过2秒子弹销毁 }
碰到子弹我们这里使用OnTriggerEnter,要想这个发生首先要确保Shell预设体里面Collider的Is Trigger已经被选中了.
然后在OnTriggerEnter里面我们检测在一定范围之内的坦克有哪些.
private float radius = 5f; // 爆炸范围
public LayerMask mask;
我们需要指定Tank属于哪个LayerMask
将Shell.cs挂载到Shell预设体上,设置相同的LayerMask
然后我们使用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
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坦克大战》4-坦克的移动和旋转
《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
---------------------------我是目录分割线---------------------------
《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理的更多相关文章
- 《杜增强讲Unity之Tanks坦克大战》10-相机控制
10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内. image 在Hierarchy点击右键 image 点击 Create Empty,生成空对象,改名 ...
- 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面Gam ...
- 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
9 发射子弹时蓄力 实现效果如下 image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...
- 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览 image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里 ...
- 《杜增强讲Unity之Tanks坦克大战》1-准备工作
0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...
- 《杜增强讲Unity之Tanks坦克大战》2-场景设置
2 场景设置 2.1 本节效果预览 2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹 Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...
- 《杜增强讲Unity之Tanks坦克大战》3-添加坦克
3 添加坦克 3.1 本节效果预览 3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面. 3.3 添加坦克模型 在Model文件夹下面找到Tank模型 将Tank ...
- 《杜增强讲Unity之Tanks坦克大战》5-子弹
5 子弹 本节的任务是创建子弹的Prefab image 首先从Model/Shell找到子弹的模型,拖入Hierarchy中,添加刚体组件,所有属性默认值. 添加Capsule Collider ...
- 《杜增强讲Unity之Tanks坦克大战》6-发射子弹
6 发射子弹 本节完成发射子弹的功能,最终代码如下: image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...
- 《杜增强讲Unity之Tanks坦克大战》7-坦克血条
7 坦克血条 点击菜单GameObject->UI->Slider创建Slider 选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...
随机推荐
- jQuery事件处理
浏览器的事件模型 DOM第0级事件模型 Event实例 他的属性提供了关于当前正被处理的已触发事件的大量信息.这包括一些细节,比如在哪个元素上触发的事件.鼠标事件的坐标以及键盘事件中单击了哪个键. 事 ...
- 1927. [SDOI2010]星际竞速【费用流】
Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的 梦想,来自杰森座α星的悠悠也是其中之一.赛车大赛的赛场由N颗行星和M条双向星 ...
- [HNOI2003]操作系统
嘟嘟嘟 这道题就是一个模拟. 首先我们建一个优先队列,存所有等待的进程,当然第一关键字是优先级从大到小,第二关键字是到达时间从小到大.然后再建一个指针Tim,代表cpu运行的绝对时间. 然后分一下几种 ...
- Jmeter不同线程组之间的变量引用
用过LoadRunner的小伙伴应该知道,它的脚本主要分为三个部分,即Login,Action,End三个模块.Login中一般是“初始化”环境所用,而Action模块主要做一些诸如压测的动作.举个例 ...
- js遍历添加栏目类添加css 再点击其它删除css
//js遍历添加栏目类添加css 再点击其它删除css $(".radio-group .ckselect").each(function(index) { $(this).cli ...
- EasyX_无法填充圆颜色的问题
官网:https://www.easyx.cn/ 在线帮助文档:https://docs.easyx.cn/ 目标:生成一个边框为黄色,填充为蓝色的圆 遇到的问题:使用以下代码,只能生成边框为黄色的圆 ...
- Redis高级应用——2
Redis-事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作,事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...
- SuperObject Delphi 的 JSON 属性乱序 - 操作类改造 - 关于属性顺序的问题
Delphi 的 ISuperObject 属性顺序为随机.但是很多时候,是需要按加入顺序进行读取.我也看了网上很多人有类似需求.也有人问过原作者,作者答复为:JSON协议规定为无序.看了我真是无语. ...
- VS2010调试和头文件路径设置
1:VS2010 release 调试C/C++ -> 常规 -> 调试信息格式, 修改为程序数据库(/Zi)C/C++ ->优化 -> 优化,修改为已禁用(/Od)链接器 - ...
- mysql-5.7.12-winx64 安装
之前安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 1.mysql-5.7.12-winx64.zip下载官方下载地址:http://dev.mysql ...