Unity3d之坦克大战(二)



这只是一个非常非常初级的教程。在Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏。下面开始吧:



1.

首先我们要创建一个炮弹。打开3DS Max,为了简单,就画一个胶囊好了。在右边栏的扩展几何体中选择胶囊。然后选中工具栏的移动工具,将胶囊移动(0,0)处,如下所示:

Unity战斗回放的技术落地方案_脚本



并保存为tankBullet.max,同时导出为tankBullet.3DS:

Unity战斗回放的技术落地方案_脚本_02





2.

将tankBullet.3DS放到Assets目录下,unity3d会自动导入。把它托入到Scene窗口中,并调整到合适位置和大小,如下所示:

Unity战斗回放的技术落地方案_脚本_03




3.

我们只是拖入了一个材质,下面需要创建对应的Entity。选择GameObject-->Create Other-->Cube 创建一个Cube,并调整到合适位置和大小。同时将第二步创建的tankBullet材质拖到Cube中,是它们成为一体。为了清晰,我们把Cube重命名成tankBulletCube。完成后结果如下:

Unity战斗回放的技术落地方案_Unity战斗回放的技术落地方案_04




4.

给tankBulletCube增加物理感应。选中tankBulletCube,选择Component-->Physics-->Rigidbody。



5.

玩家按下空格键的时候发射导弹。我们用创建的导弹做Prefab(Prefab是大量重复的小Entity):

首先在Project窗口中创建一个Prefab文件夹,然后右击,选择Create-->Prefab,输入名称tankBulletPrefab,如下所示:

Unity战斗回放的技术落地方案_hierarchy_05



可以看到,一开始tankBulletPrefab前的图标是灰的:

Unity战斗回放的技术落地方案_脚本_06



把我们创建的tankBulletCube拖动到tankBulletPrefab中就会看到,图标变成蓝色的了:

Unity战斗回放的技术落地方案_Unity战斗回放的技术落地方案_07




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中。完成后如下所示:

Unity战斗回放的技术落地方案_audio_08




8.

将tankBulletFire.js脚本拖动到Cube,注意到此时FirePoint和Bullet还是None的:

Unity战斗回放的技术落地方案_hierarchy_09


把FirePoint和tankBulletPrefab分别拖动到FirePoint和Bullet的,完成后如下所示:

Unity战斗回放的技术落地方案_hierarchy_10




9.

下面运行游戏,按下空格键,我们的炮弹就发射出来了(下图的小白点),同时注意到Hierarchy窗口中会出现大量的tankBulletPrefab:

Unity战斗回放的技术落地方案_vector_11




10.

炮弹发射后应该会有白光。选择GameObject-->Create Other-->Particle System创建例子系统,并命名为tankBulletParticleSystem,调整大小和数量,如下所示:

Unity战斗回放的技术落地方案_hierarchy_12




11.

把tankBulletParticleSystem加入到tankBulletCube中。再次运行程序,我们的炮弹是不是漂亮很多了,哈哈:

Unity战斗回放的技术落地方案_audio_13




12.

我们需要在炮弹打到物体或飞行一段距离后自动销毁。

新建一个tankBulletDestroy.js脚本,输入:

function OnCollisionStay(collisionInfo : Collision)
{
	//yield WaitForSeconds(2.0);  //等待2秒
	Destroy(gameObject);
}



OnCollisionStay这个函数会在物体发生碰撞后被调用。我们在碰撞后立即销毁。哈哈,测试一下。




13.

是不是单调了点?我们给发射导弹加上音效吧:

在Project窗口新加一个Audio文件夹,拖入声音文件,如下所示:

Unity战斗回放的技术落地方案_hierarchy_14





14.

给坦克Cube加入一个Audio Source。选择坦克Cube,选择GameObject-->Create Empty,命名为tankBulletFireSound。选中它,选择Component-->Audio-->Audio Source,然后将声音文件拖入Audio Clip一栏,并把tankBulletFireSound加入坦克Cube中,同时注意去掉Play On Awake复选框(否则程序一开始就会发声):

Unity战斗回放的技术落地方案_hierarchy_15





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变量中:

Unity战斗回放的技术落地方案_vector_16




16.

测试一下,发射导弹时,是不是也有声音啦,哈哈~~








完成!