Unity3d之坦克大战(二)
这只是一个非常非常初级的教程。在Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏。下面开始吧:
1.
首先我们要创建一个炮弹。打开3DS Max,为了简单,就画一个胶囊好了。在右边栏的扩展几何体中选择胶囊。然后选中工具栏的移动工具,将胶囊移动(0,0)处,如下所示:
并保存为tankBullet.max,同时导出为tankBullet.3DS:
2.
将tankBullet.3DS放到Assets目录下,unity3d会自动导入。把它托入到Scene窗口中,并调整到合适位置和大小,如下所示:
3.
我们只是拖入了一个材质,下面需要创建对应的Entity。选择GameObject-->Create Other-->Cube 创建一个Cube,并调整到合适位置和大小。同时将第二步创建的tankBullet材质拖到Cube中,是它们成为一体。为了清晰,我们把Cube重命名成tankBulletCube。完成后结果如下:
4.
给tankBulletCube增加物理感应。选中tankBulletCube,选择Component-->Physics-->Rigidbody。
5.
玩家按下空格键的时候发射导弹。我们用创建的导弹做Prefab(Prefab是大量重复的小Entity):
首先在Project窗口中创建一个Prefab文件夹,然后右击,选择Create-->Prefab,输入名称tankBulletPrefab,如下所示:
可以看到,一开始tankBulletPrefab前的图标是灰的:
把我们创建的tankBulletCube拖动到tankBulletPrefab中就会看到,图标变成蓝色的了:
6.
下面我们在Scripts文件夹下新建一个tankBulletFire.js脚本,用来控制导弹的发射,如下:
var FirePoint:Transform;
var Bullet:Rigidbody;
function Update ()
{
if(Input.GetKeyDown(KeyCode.Space))
{
var clone : Rigidbody;
clone = Instantiate(Bullet, FirePoint.position, FirePoint.rotation);
clone.velocity = transform.TransformDirection(Vector3.forward * 100);
}
}
代码中有两个变量:FirePoint和Bullet。前者是发射炮弹的起点,后者则是实际的炮弹。如果玩家按下空格,则我们在FirePoint的地方实例化一个Bullet,并设置它向前运动。
7.
下面我们创建发射炮弹的起点。选择GameObject-->Create Empty,并命名为FirePoint。同时将它的位置调整到坦克炮口前方(离炮口必须有一点距离,否则由于坦克和炮弹都是Rigidbody,一发射就会碰撞),同时还要把它加入到坦克Cube中。完成后如下所示:
8.
将tankBulletFire.js脚本拖动到Cube,注意到此时FirePoint和Bullet还是None的:
把FirePoint和tankBulletPrefab分别拖动到FirePoint和Bullet的,完成后如下所示:
9.
下面运行游戏,按下空格键,我们的炮弹就发射出来了(下图的小白点),同时注意到Hierarchy窗口中会出现大量的tankBulletPrefab:
10.
炮弹发射后应该会有白光。选择GameObject-->Create Other-->Particle System创建例子系统,并命名为tankBulletParticleSystem,调整大小和数量,如下所示:
11.
把tankBulletParticleSystem加入到tankBulletCube中。再次运行程序,我们的炮弹是不是漂亮很多了,哈哈:
12.
我们需要在炮弹打到物体或飞行一段距离后自动销毁。
新建一个tankBulletDestroy.js脚本,输入:
function OnCollisionStay(collisionInfo : Collision)
{
//yield WaitForSeconds(2.0); //等待2秒
Destroy(gameObject);
}
OnCollisionStay这个函数会在物体发生碰撞后被调用。我们在碰撞后立即销毁。哈哈,测试一下。
13.
是不是单调了点?我们给发射导弹加上音效吧:
在Project窗口新加一个Audio文件夹,拖入声音文件,如下所示:
14.
给坦克Cube加入一个Audio Source。选择坦克Cube,选择GameObject-->Create Empty,命名为tankBulletFireSound。选中它,选择Component-->Audio-->Audio Source,然后将声音文件拖入Audio Clip一栏,并把tankBulletFireSound加入坦克Cube中,同时注意去掉Play On Awake复选框(否则程序一开始就会发声):
15.
下面我们修改tankBulletFire.js脚本来加入声音的控制:
var FirePoint:Transform;
var Bullet:Rigidbody;
var tankBulletFireSound:AudioSource;
function Update ()
{
if(Input.GetKeyDown(KeyCode.Space))
{
var clone : Rigidbody;
clone = Instantiate(Bullet, FirePoint.position, FirePoint.rotation);
clone.velocity = transform.TransformDirection(Vector3.forward * 100);
tankBulletFireSound.Play();
}
}
同时将坦克Cube的tankBulletFireSound拖入脚本的tankBulletFireSound变量中:
16.
测试一下,发射导弹时,是不是也有声音啦,哈哈~~
完成!