纳金网

标题: 第一人称射击游戏(三) [打印本页]

作者: 会飞的鱼    时间: 2011-12-12 14:55
标题: 第一人称射击游戏(三)
飞弹爆炸



下面,当飞弹与其他物体发生碰撞时,增加一个爆炸效果。要实现这个效果,我们要编写一段新脚本赋予飞弹。



创建一个新脚本,命名为Projectile。拖放到工程面板的WeaponScripts文件夹下。

那么我们想要脚本Projectile实现什么样的效果呢?我们要检测飞弹是否发生碰撞,然后在碰撞点产生一个爆炸效果。代码如下:



var explosion : GameObject;

function OnCollisionEnter( collision : Collision )

{



函数OnCollisionEnter内的程序代码的作用是计算被赋予脚本的物体是否与其他物体发生碰撞。



var contact: ContactPoint=collision.contacts[0];



在函数OnCollisionEnter中我们主要是要实现在3D空间中飞弹发生碰撞的点产生一个新爆炸。那么在何处了碰撞的呢?函数OnCollisionEnter就有个记录这个信息的功能。碰撞发生的点的信息储存在变量ContactPoint中。



var rotation=Quaternion.FromToRotation(Vector3.up,contact.normal);

var instantiatedExplosion:GameObject=Instantiate(

   explosion,contact.point,rotation);



这里我们使用函数Instantiate来创建一个爆炸。我们已经知道函数instatiate有三个参数:(1)产生的物体(2)物体的3D空间位置(3)物体的旋转。

第一个参数,后面我们将会赋给一个带粒子系统的游戏物体。同时我们还想通过编辑器来实现这个功能,所以我们把变量设置为外部变量。

第二个参数,爆炸产生的点的位置,就是碰撞发生的位置。

第三个参数,爆炸旋转的设置,需要解释一下。我们需要爆炸体的Y轴方向与飞弹和其他物体发生碰撞的那个表面的法线方向一致。这就是说如果是墙面那么爆炸就面向外,如果是地板就朝上。那么实际上我们就是要使爆炸体在本地坐标系的Y轴与飞弹与之碰撞的物体的表面法线方向(世界坐标系)一致。



Destroy(gameObject);

}



最后,我们要让飞弹碰撞后就从游戏中消失,通过函数Destroy()实现,它的参数是gameObject(gameObject代表被赋予这个脚本的物体)。

Projectile.js全部代码如下:



var explosion : GameObject;

function OnCollisionEnter( collision : Collision )

{

var contact : ContactPoint = collision.contacts[0];

var rotation = Quaternion.FromToRotation( Vector3.up, contact.normal );

var instantiatedExplosion : GameObject = Instantiate(

explosion, contact.point, rotation );

Destroy( gameObject );

}



把脚本赋予飞弹预制物体(Missile prefab)。



下面我们要创建飞弹发生碰撞时所产生爆炸的爆炸效果物体。

首先,创建一个新的预制物体(命名为Explosion)用来存放爆炸效果资源。

标准资源包中(standard asset)有个不错的爆炸预制物体,粒子系统和灯光都设置好了。把这个爆炸预制物体(在Standard Assets/Particles/explosion中)拖放到层级面板。

调节这个爆炸效果的各个参数直到你觉得满意,然后把它从层级面板中拖放到工程面板中的爆炸预制物体(Explosion Prefab)中。



现在把爆炸配置给飞弹:

    点选飞弹预制物体(Missile Prefab),在参数面板Explosion变量栏,拖放工程面板中的爆炸到上面。



定义爆炸的行为



下面我们要再创建一个脚本来定义爆炸自身的特性。

创建一个新的脚本-Explosion,放在Weapons文件夹中,双击脚本进行编辑。



脚本中另一个常用函数称为Start()。当它配置给的物体是在游戏中产生的时候,函数Start()中的代码只被执行一次。我们要实现的效果就是在一定时间后,在游戏中删除爆炸。我们通过函数Destroy()的第二个参数实现,它的作用是定义执行删除前的时间长度。

var explosionTime=1.0;

function Start( )

{

   Destroy(gameObject,explosionTime);

}

变量explosionTime设置成外部变量,方便调节。

新建脚本插入以上代码时,要删除函数Update()。

把脚本Explosion赋予给爆炸预制物体。



音效



目前的游戏世界太安静了,让我们给爆炸效果增加点音效。

首先,给爆炸预制(Prefab)添加一段音频。

   给爆炸添加音效前,我们首先要添加一个音源部件(Audio Source),在主菜单点击Component—Audio—Audio Source。你会发现音源部件有一个Audio Clip的属性。

把“RocketLauncherImpact”音效添加给爆炸预制体的AudioClip外部变量。Unity支持多种音频格式。

运行游戏,发射飞弹的时候就有声音了!



由 lsermao  发表

作者: 奇    时间: 2012-4-1 23:31
我就看看,我不说话

作者: tc    时间: 2012-4-3 23:31
呵呵,很好,方便罗。

作者: C.R.CAN    时间: 2012-4-16 23:20
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!

作者: tc    时间: 2012-7-19 23:30
不错哦,顶一下......

作者: 晃晃    时间: 2012-12-15 23:19
提醒猪猪,千万不能让你看见

作者: C.R.CAN    时间: 2013-3-6 23:27
都闪开,介个帖子,偶来顶

作者: nts    时间: 2013-10-17 11:05
楼上全是大太阳啊




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5