查看: 2729|回复: 6
打印 上一主题 下一主题

第一人称射击游戏(中级教程)(二)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

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

跳转到指定楼层
楼主
发表于 2011-12-13 14:18:27 |只看该作者 |倒序浏览


下面来创建第一个武器



火箭发射器



这部分来讲讲如何制作类似火箭发射器的武器。
发射器

火箭发射器用来产生一枚火箭弹并给它一个初速度。火箭弹发射的方向为角色指向的任意方向,并且它将在与其它任意碰撞器发生碰撞时爆炸。

增加一个空游戏物体,命名为“RocketLauncher”。把这个空游戏物体的位置移动到Fps Controller大概手部的位置。

层级栏中,把RocketLauncher拖放到主摄像机下作为主摄像机的子物体。这样的话,可以使发射器的发射方向与摄像机一致,同时发射器的移动也与FPS Controller一致了。

工程栏中,点击Object文件夹下的发射器,在参数设置面板中,把FBXImporter下的Scale Factor设置为1,否则模型在场景中不是真实大小,会非常小。

把Object文件夹下的模型物体rocketLauncher拖放使其成为游戏物体RocketLauncher的子物体。
发射器的脚本RocketLauncher内容如下:

var projectile : Rigidbody;

var initialSpeed = 20.0;

var reloadTime = 0.5;

var ammoCount = 20;

private var lastShot = -10.0;

function Fire ()

{

// Did the time exceed the reload time?

if (Time.time > reloadTime + lastShot && ammoCount > 0)

{

// create a new projectile, use the same position and rotation as the Launcher.

var instantiatedProjectile : Rigidbody = Instantiate (projectile,

transform.position, transform.rotation);

// Give it an initial forward velocity. The direction is along the z-axis of

// the missile launcher's transform.

instantiatedProjectile.velocity = transform.TransformDirection(

Vector3 (0, 0, initialSpeed));

// Ignore collisions between the missile and the character controller

Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider);

lastShot = Time.time;

ammoCount--;

}

}
这段代码确保了物体发射速度不大于reloadTime(加载时间)。它同时还使玩家在弹药数量足够的条件下才能开火。

这里火箭发射的行为定义,有些类似前面基础教程,除了这里有发射加载时间和弹药限制。

把脚本RocketLauncher赋予给RocketLauncher游戏物体。不能把脚本赋予给RocketLauncher游戏物体的子物体(模型物体)!
火箭弹

现在我们在场景中创建一个火箭弹并放置一个预制体中(Prefab)。

工程栏中的Object文件夹下点选rocket,在FBXImporter中设置ScaleFactor为1,否则模型导入到场景中会非常小。

把rochet物体拖放到场景中。

赋予Rocket脚本。

给模型rocket增加一个box collider,调节box碰撞器大小,使其比火箭弹模型稍微大一点点即可,避免穿透错误。穿透错误是由于游戏物体大小很小、速度很快,导致碰撞监测不能计算与它的碰撞从而发生了穿透现象。在Z轴向调节box碰撞器大小,使它能有效响应。

在火箭弹物体刚体属性选项中,不勾选“Use Gravity”。这样火箭弹不会受重力影响。

创建一个粒子系统:GameObject-Greate Other-Particle System

设定Ellipsoid中x,y,z为0.1

设定Rnd Velocity中每个轴向值设为0.1

粒子发射器Min Size和Max Size都设为0.5

粒子数改为100(Min和Max Emission)

把Effects下smoke拖放到粒子系统中

在粒子动画器部分,设定World Rotation Axis值为0.5

设置变量Size Grow为3

开启粒子系统中Autodestruct选项,这个可以实现火箭弹毁灭后粒子系统也随之消失。

层级面板中,把粒子系统拖拽使其成为火箭弹的子物体。重置粒子系统transform使其位于火箭弹中央,然后再把它的位置设在火箭弹尾部。



在层级栏中选择火箭弹,在场景中四处移动下,看看尾部是否有烟状尾迹。
现在一个带尾迹的火箭弹就制造完毕了,下面可以把火箭弹设定为预制体了。

首先创建一个空预制体(Prefab)来加载火箭弹,命名为“Rocket”

层级栏中选择火箭弹,拖拽至新的“Rocket”预制体

工程栏中创建一个新文件夹,命名为“WeaponPrefabs”,用来存放武器预制物体。

火箭弹脚本Rocket内容如下:
// The reference to the explosion prefab

var explosion : GameObject;

var timeOut = 3.0;

// Kill the rocket after a while automatically

function Start () {

Invoke("Kill", timeOut);

}
函数Kill作用如下,首先找到子层级下的粒子发射器,关闭发射状态。然后,分离被赋予脚本的物体(这里的火箭弹)的任何子物体(例如这里的烟雾尾迹粒子系统)并销毁火箭弹。
function OnCollisionEnter (collision : Collision) {

// Instantiate explosion at the impact point and rotate the explosion

// so that the y-axis faces along the surface normal

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

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

Instantiate (explosion, contact.point, rotation);

// And kill our selves

Kill ();

}

function Kill ()

{

// Stop emitting particles in any children

var emitter : ParticleEmitter= GetComponentInChildren(ParticleEmitter);

if (emitter)

emitter.emit = false;

// Detach children - We do this to detach the trail rendererer which

// should be set up to auto destruct

transform.DetachChildren();
最重要程序的是这句transform.DetachChildren(),它就是预先销毁game Object(这里的火箭弹),这样当火箭弹炸毁时,它的尾迹就不再是它的子物体了。
// Destroy the projectile

Destroy(gameObject);

}

@script RequireComponent (Rigidbody)
命令@script确保对被赋予脚本的物体添加一个刚体属性(脚本使用对象要求是刚体)。

一旦火箭弹与另一个带碰撞器的物体发生碰撞,我们希望销毁火箭弹物体。但是如果尾迹是直接关联在火箭弹上面的话,尾迹也会同时被销毁,烟雾会立即消失。因此,就要在销毁火箭弹之前分离子物体尾迹粒子系统。

注意,火箭弹是通过两种方式来销毁,一种是发射后超过3秒自动销毁,二是发生碰撞销毁。
选择火箭发射器

把武器预制文件夹下的火箭弹拖拽放置火箭发射器Projectile参数栏中

运行游戏,当发射火箭弹时,它的尾部应该有一道尾迹了



由 lsermao  发表



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

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

沙发
发表于 2012-1-29 23:24:22 |只看该作者
八方捷报,四海增辉。 一元复始,九州同庆; 八方和协,四季平安。 万里江山,增奇添彩; 四化图景,流翠飞红。
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

板凳
发表于 2012-4-2 23:20:56 |只看该作者
水。。。
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

地板
发表于 2012-6-7 23:19:34 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶!
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

5#
发表于 2012-7-4 23:20:25 |只看该作者
不错哦,谢谢楼主
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

6#
发表于 2012-10-7 23:26:32 |只看该作者
其实楼主所说的这些,俺支很少用!
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

7#
发表于 2012-11-12 23:34:39 |只看该作者
先顶上去,偶要高亮加精鸟!
回复

使用道具 举报

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

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

GMT+8, 2024-11-29 21:37 , Processed in 0.097108 second(s), 31 queries .

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

© 2008-2019 Narkii Inc.

回顶部