纳金网

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

作者: 会飞的鱼    时间: 2011-12-12 14:51
标题: 第一人称射击游戏(二)
编写飞弹发射器脚本
FPS控制器是一个包含了几个游戏物体和部件的预制物体。FPS控制器本身是一个只能沿Y轴旋转的圆柱体,因此,如果我们直接把发射器脚本赋予FPS控制器的话,是实现不了上下开火的。所以我们把脚本赋予控制器中的能够四周转动的主摄像机。

下面我们来编写第一个描述发射器行为的JavaScript代码。

点击Assets>Greate>JavaScript,创建一个空的JavaScript文档。一个名为“NewBehaviourScript”资源将会出现在工程面板中,把它更名为“MissileLauncher”

技巧:通过Unity>references点击External Script Editor,可以自定义外部脚本编辑器。

工程面板中创建一个“WeaponScripts”文件夹,放置我们所有的武器脚本。把MissileLauncher脚本和飞弹预制物体(Missile Prefab)拖到这个文件中。

我们来看看飞弹发射器的完整JavaScript脚本。

进一步思考一下,我们到底想实现什么效果?我们要检测玩家是否按了开火键,然后产生一枚飞弹,然后把它沿着玩家朝向的方向按照一定的速度发射出去。我们仔细的解剖一下脚本:

var projectile: Rigibody;

var speed=20;

function Update( )

{

这是脚本的开头部分,定义了一些属性,开启了“Update”的功能

if(Input.GetButtonDown(“Fire1”))

首先我们要检测玩家是否按了开火键,“开火1”映射的是鼠标左键和当前配置的键盘上的按键(可以通过主菜单栏的Editor>roject Settings>Input设定)

{

var instantiatedProjectile: Rigidbody=Instantiate(

     projectile, transform.position,transform.rotation);

我们用变量来定义产生的物体。变量的类型是Rigibody(刚体),因为飞弹是具有物理属性的。

Unity中产生新物体使用的函数是Instantiate,它有三个参数,分别是:产生的物体、产生物体的3D空间位置、物体的旋转。它还有另一个语法结构,参照API手册,这里我们只使用这种结构。

第一个参数,projectile,代表我们想创建的物体。那么到底发射什么物体?具体产生的物体是可以手动设定的。实现方法:把Projectile定义为函数的外部变量,这样就可以在参数面板中显示出来。发射的物体也可以通过代码来创建,但如果你想使一个变量可调的话,还是用上面的方法。

第二个参数,transform.position,使产生的物体与发射器的空间位置一致。为什么就是发射器呢?因为如果要使飞弹产生的位置没有问题,脚本就要关联给发射器。(transform读取的transform数据就是被赋予脚本的游戏物体transform数据)

第三个参数transform.rotation,与第二个类似,只是它的值与发射器的旋转值是一样的。

instantiatedProjectile.Vellocity=

transform.TransformDirection(Vector3(0,0,speed));

代码的下一部分使飞弹产生运动。为了实现运动,我们要赋予飞弹一个速度,但是在哪个方向上(X,Y,Z)产生速度呢?在场景中,点击FPS控制器,出现运动箭头(如果没有出现,按“W”键),其中一个箭头是红色、一个是绿色、一个是蓝色。红色代表X轴,绿色代表Y轴,蓝色代表Z轴。因为蓝色指向的方向,与玩家面朝的方向一致,所以我们要在Z轴上给飞弹一个速度。

(Velocity)速度是instantiatedProjectile的一个属性。我们怎么知道的呢?因为instantiatedProjectile是刚体的一种,如果我们看看API手册,我们就会知道速度是刚体的属性中的一种。同时也看看刚体的其它属性。要设置速度,我们就必须在各个轴向上设定数值。但还有个小问题。3D空间中的物体一般使用两种坐标模型:本地坐标系和世界坐标系。在本地坐标系中,物体的轴向只与物体本身有关。在世界坐标系中,轴向是绝对的,例如:向上,对所有物体来讲向上的方向都是一样的。Rigidbody.Vellocity刚体物体速度必须使用世界坐标系。因此,定义速度时,需要把本地坐标系中的Z轴(朝前的方向)向转换成世界坐标系中的相应方向。可以用函数transform.TransformDirection,它有三个向量作为自变量。变量speed也应该定义成外部变量,便于后面在编辑器中直接调节数值。

Physics.IgnoreCollision(instantiatedProjectile.collider,

   transform.root.collider);

}

}

最后,我们要关闭飞弹与游戏角色之间的碰撞。如果不这样做的话,飞弹产生的时候就可能与角色发生碰撞。可以在API手册IgnoreCollision下查询详细信息。

MissileLauncher.js全部完整代码如下:

var projectile : Rigidbody;

var speed = 20;

function Update()

{

if( Input.GetButtonDown( "Fire1" ) )

{

var instantiatedProjectile : Rigidbody = Instantiate(

projectile, transform.position, transform.rotation );



instantiatedProjectile.velocity =

transform.TransformDirection( Vector3( 0, 0, speed ) );



Physics.IgnoreCollision( instantiatedProjectile. collider,

transform.root.collider );

}

}



把脚本MissileLauncher赋予FPS控制器中的发射器。在层级面板中点击发射器,检查一下参数面板下面是否显示了MissileLauncher script。

先前创建的飞弹的预制物体还没有与脚本中的变量projectile创建关联,我们需要在编辑器中创建一下。变量projectile只能与刚体关联,因此,首先我们要赋予飞弹一个Rigidbody。

工程面板中点击飞弹,然后从主菜单栏选择Components>hysics>Rigidbody。这样将会给我们想开火发射的飞弹一个刚体属性。我们必须确保想在游戏中发射的物体类型与脚本中外部变量要求的物体类型是同一类型的物体。

创建飞弹与脚本中变量projectile的链接。首先在层级面板中点击发射器,然后把飞弹的预制物体从工程面板中拖拽放置在发射器参数面板中MissileLauncher script部分上。

运行游戏的话,你会发现点击开火键可以发出一个受重力影响的小球了。
作者: C.R.CAN    时间: 2012-2-16 23:19
很有心,部分已收录自用,谢谢

作者: 难骑    时间: 2012-2-17 19:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: C.R.CAN    时间: 2012-2-24 23:31
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长

作者: tc    时间: 2012-2-28 03:13
有意思!学习了!

作者: 菜刀吻电线    时间: 2012-3-17 23:28
长了不少见识

作者: C.R.CAN    时间: 2012-4-4 23:26
非常感谢,管理员设置了需要对新回复进行审核,您的帖子通过审核后将被显示出来,现在将转入主题

作者: C.R.CAN    时间: 2012-5-30 23:26
再看一看,再顶楼主

作者: tc    时间: 2012-6-12 23:24
你们都躲开,我来顶

作者: tc    时间: 2012-7-27 23:24
先垫一块,再说鸟

作者: C.R.CAN    时间: 2012-10-3 23:26
不会吧,太恐怖了

作者: 晃晃    时间: 2012-12-16 23:22
跑着去顶朋友滴铁

作者: 菜刀吻电线    时间: 2013-2-20 23:24
楼主收集的可真全哦

作者: 奇    时间: 2013-3-15 23:19
再看一看,再顶楼主

作者: nts    时间: 2013-10-17 11:04
不错的学习内容,要是有源代码就更好了




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