纳金网
标题:
第一人称射击游戏(中级教程)(二)
[打印本页]
作者:
会飞的鱼
时间:
2011-12-13 14:18
标题:
第一人称射击游戏(中级教程)(二)
下面来创建第一个武器
火箭发射器
这部分来讲讲如何制作类似火箭发射器的武器。
发射器
火箭发射器用来产生一枚火箭弹并给它一个初速度。火箭弹发射的方向为角色指向的任意方向,并且它将在与其它任意碰撞器发生碰撞时爆炸。
增加一个空游戏物体,命名为“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 发表
作者:
奇
时间:
2012-1-29 23:24
八方捷报,四海增辉。 一元复始,九州同庆; 八方和协,四季平安。 万里江山,增奇添彩; 四化图景,流翠飞红。
作者:
C.R.CAN
时间:
2012-4-2 23:20
水。。。
作者:
奇
时间:
2012-6-7 23:19
凡系斑竹滴话要听;凡系朋友滴帖要顶!
作者:
奇
时间:
2012-7-4 23:20
不错哦,谢谢楼主
作者:
奇
时间:
2012-10-7 23:26
其实楼主所说的这些,俺支很少用!
作者:
奇
时间:
2012-11-12 23:34
先顶上去,偶要高亮加精鸟!
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5