查看: 2975|回复: 7
打印 上一主题 下一主题

[教程] 第一人称射击游戏(三)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2011-12-12 14:55:51 |只看该作者 |倒序浏览
飞弹爆炸



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



创建一个新脚本,命名为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  发表
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2012-4-1 23:31:29 |只看该作者
我就看看,我不说话
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2012-4-3 23:31:10 |只看该作者
呵呵,很好,方便罗。
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-4-16 23:20:10 |只看该作者
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-7-19 23:30:04 |只看该作者
不错哦,顶一下......
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

6#
发表于 2012-12-15 23:19:42 |只看该作者
提醒猪猪,千万不能让你看见
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2013-3-6 23:27:22 |只看该作者
都闪开,介个帖子,偶来顶
回复

使用道具 举报

nts    

3

主题

1

听众

743

积分

初级设计师

Rank: 3Rank: 3

纳金币
7
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2013-10-17 11:05:04 |只看该作者
楼上全是大太阳啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-7 06:03 , Processed in 0.088202 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部