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

第一人称射击游戏(四)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

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

跳转到指定楼层
楼主
发表于 2011-12-13 14:05:32 |只看该作者 |倒序浏览
添加图形界面



下面我们来添加GUI,有点像头部显示设备(HUD)。我们要做的GUI非常简单,就一个准星。

添加一个准星:

工程栏中创建一个GUI的文件夹。

创建一个新脚本,命名为“准星”(Crosshair),拖到GUI文件夹。

Crosshair中写入下面的脚本:

var crosshairTexture:Texture2D;

var position:Rect;

function Start( )

{

   position=Rect((Screen .with-crosshairTexture.with)/2,(Screen.height-crosshairTexture.height)/2,crosshairTexture,crosshairTexture.height);



}

function OnGUI( )

{

   Gui.DrawTexture(position,crosshairTexture);

}



首先我们设定了两个变量。第一个变量是定义我们将要用可选的方式来选择图形纹理。第二个变量定义了一个方形区间,它是图形纹理在屏幕上的位置范围。

在start( ) 中函数用来设定图形纹理在屏幕上的位置。函数中,有四个参数,用来定义方形区域的大小和位置。第一个参数定义了方形区域的左边框,第二个是底边框,第三和第四个参数定义了宽和高。

OnGUI( )函数中,使用GUI类程序来让图形显示在屏幕上。DrawTexture( )函数的参数position和crosshairTexture将使准星显示在屏幕的中央位置。

保存脚本。

创建一个新的空物体,命名为“GUI”。

把脚本“Crosshair”赋予给GUI物体。

点选GUI物体,把在文件夹Texturelaim下的欲使用的图形拖放到参数面板变量Crosshair Texture中。

运行游戏,屏幕中就会有准星显示了。



物理特效:



现在,我们想要游戏中的物体效果越真实越好,这是通过添加物理特效实现的。在这一节中,我们将在环境中添加一些物体,他们能被飞弹击中后有相应的反应。首先有几个新概念要解释下。



校正(Update)



先前,我们在函数Update()中写入代码,这样可以在每一帧都执行其中的代码。其中有个例子是检测玩家点击开火键。帧速并不是一个固定值,它是根据场景复杂度等因素来定的。各帧之间的时间差会导致不稳定的物体反应。因此,如果想在场景中添加有物理反应的物体(刚体等),代码就应该写在函数FixedUpdate()中。Unity中deltaTime的值用来测定渲染两个连续帧的所用时间。



一般而言,函数Update与FixedUpdate之间的区别如下:



Update()-其中的代码通常用于角色行为、游戏逻辑等。这个函数中的deltaTime值并不是固定的。



FixedUpdate()-其中的代码通常用于刚体物体(物理属性的行为)。函数中deltaTime的值通常是固定的。



FixedUpdate函数被调用的频率是主菜单中Edit-Project Settings-Time的FixedTimestep属性确定的,当然也是可以更改的。第二个属性Time Scale是读取每秒的帧速和相应的倒数值。

技巧:定义FixedTimestep值时,要注意把握好一个平衡:值越小,物理效果越真实越好,但影响游戏运行速度。应该同时确保游戏运行速度和物理效果的真实性。



最后说一下yield,它相当于暂停当前正在执行的函数。



回到游戏,我们想实现的效果:



使玩家可以发射飞弹(已经实现了)。



如果飞弹与其它刚体物体发生碰撞,检测其范围类是否有其它被赋予刚体属性的物体。

对爆炸冲击力范围内的每个刚体物体,均给予一个upwards方向上的力,使它们对飞弹产生反应。



让我们看看修改后的爆炸脚本(Explosion Javascript)



var explosionTime = 1.0;

var explosionRadius = 5.0;

var explosionPower = 2000.0;

function Start()

{

//Destroy the explosion in x seconds,

//this will give the particle system and audio enough time to finish playing

Destroy( gameObject, explosionTime );

//Find all nearby colliders

var colliders : Collider[] = Physics.Overlapsphere( transform.position,

explosionRadius );



首先检测下飞弹落点周围是否有带碰撞器的物体。函数Physics.OverlapSphere()有两个参数:3D位置和半径值,然后返回一组检测到的在半径内的碰撞器的数组。



//Apply a force to all surrounding rigid bodies.

for( var hit in colliders )

{



一旦得到这些数组后,就会对每个对应碰撞器的刚体物体一个在特定方向上的力。



if( hit.rigidbody )

{

hit.rigidbody.AddExplosionForce( explosionPower,

transform.position, explosionRadius );

}

}



然后我们在飞弹的炸点处,向上的方向增加一个力(ExplosionPower)。但是,爆炸效果是随着距离而递减的,作用力大小不能在整个半径内都一样。圆周位置的刚体物体受到的作用力应该比炸点中心处小。函数把这种效果也考虑在内的。通过调节外部变量explosionPower和explosionRadius的值,可以较容易的得到想要的效果。

//If we have a particle emitter attached, emit particles for .5 seconds

if( particleEmitter )

{

particleEmitter.emit = ***e;

yield WaitForSeconds( 0.5 );

particleEmitter.emit = false;

}

}

如果一个粒子发射器也添加到了爆炸预制中的话,然后就开始发射粒子,0.5秒后停止发射(yield)。



完整爆炸脚本如下:



var explosionTime = 1.0;

var explosionRadius = 5.0;

var explosionPower = 2000.0;

function Start()

{

//Destroy the explosion in x seconds,

//this will give the particle system and audio enough time to finish playing

Destroy( gameObject, explosionTime );

//Find all nearby colliders

var colliders : Collider[] = Physics.OverlapSphere( transform.position,

explosionRadius );

//Apply a force to all surrounding rigid bodies.

for( var hit in colliders )

{

if( hit.rigidbody )

{

hit.rigidbody.AddExplosionForce( explosionPower,

transform.position, explosionRadius );

}

}

//If we have a particle emitter attached, emit particles for .5 seconds

if( particleEmitter )

{

particleEmitter.emit = ***e;

yield WaitForSeconds( 0.5 );

particleEmitter.emit = false;

}

}



由 lsermao  发表
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

沙发
发表于 2012-2-17 23:24:32 |只看该作者
不错哦,谢谢楼主
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

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

板凳
发表于 2012-3-16 23:23:15 |只看该作者
都闪开,介个帖子,偶来顶
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

地板
发表于 2012-5-14 23:19:15 |只看该作者
真是不错啊
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

5#
发表于 2012-9-3 01:24:18 |只看该作者
心中有爱,爱咋咋地
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

6#
发表于 2012-9-23 23:24:59 |只看该作者
很经典,很实用,学习了!
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

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

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

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

8#
发表于 2013-3-5 23:25:39 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶
回复

使用道具 举报

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

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-18 23:34 , Processed in 0.097335 second(s), 33 queries .

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

© 2008-2019 Narkii Inc.

回顶部