Unity 4.3游戏开发项目实战(C#、JavaScript版本)
上QQ阅读APP看书,第一时间看更新

2.7 爆炸效果

所谓爆炸效果,这里指的是炮弹与陨石碰撞所发生的爆炸效果,以及炮弹与飞机碰撞所发生的爆炸效果。

2.7.1 炮弹与陨石碰撞的爆炸效果

下面讲解如何实现炮弹与陨石碰撞所发生的爆炸效果。

1.设置爆炸图片

爆炸图片位于Image文件夹中,名称为“explosionEnemy”,是一个七帧图像的图片,如图2-87所示。

图2-87 explosionEnemy序列爆炸图片

在默认情况下,该图片的Texture Type设置为Texture,如图2-88所示。

图2-88 默认的图片设置

为了得到原始图片的真实尺寸大小,提高图片的清晰度,这里需要重新设置图片的Texture Type。

在图2-89中,选择Texture Type为Advanced, Non Power of 2为None,最底部的属性Format为Automatic Truecolor,最后单击“Apply”按钮,即可完成新的设置,此时在Preview预览窗口中显示图片原始的尺寸大小为308×49像素。也就是说,对于每帧的爆炸图片,大小为44×49像素。在项目Project窗格中,首先选择prefabs文件夹中的sprite对象,直接拖放该对象到层次Hierarchy窗格中,此时将该对象的名称修改为explosionEnemy;然后将Image文件夹下的explosionEnemy图片,拖放到层次Hierarchy窗格中的explosionEnemy对象之上,设置explosionEnemy对象的Position参数为:X=0, Y=0.5, Z=0; Scale参数为:X=0.88, Y=0.98, Z=1,如图2-90所示。

图2-89 设置陨石爆炸图片

图2-90 显示爆炸图片

在图2-90中,整个爆炸图片(包括七帧爆炸图)显示在explosionEnemy对象中,由于七帧序列图片显示在一个大的图片中,爆炸图片看得不太清楚。

为了显示爆炸图片中的每一帧图片,在图2-91中,设置Tiling属性的X=0.143,表示是七张图片之一(1/7);设置Offset属性的X=0,则会显示第一帧爆炸图片。

图2-91 显示第一帧图片

为了显示指定的第二帧爆炸图片,则需要设置Offset属性的X=0.143,如图2-92所示。依次类推,为了指定的显示第七帧爆炸图片,则需要设置Offset属性的X=0.858。

图2-92 显示第二帧图片

因此,从上面的实验可以看出:为了显示指定帧数的爆炸图片,可以通过设置Tiling以及Offset属性的X值即可。

2.代码显示爆炸图片

要在代码中显示指定帧数的图片,可以通过renderer.material.mainTextureScale语句设置Tiling属性;可以通过renderer.material.mainTextureOffset语句设置Offset属性。

对于C#开发者来说,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“C# script”命令,创建一个C#文件,该文件名称为ExplosionController。在ExplosionController.cs中书写实现爆炸动画的代码,见代码2-25。

代码2-25 ExplosionController的C#代码

1: using UnityEngine;
2: using System.Collections;
3:
4: public class ExplosionController : MonoBehaviour
5: {
6:
7:   public int index=0;
8:   public int frameNumber=7;
9:
10:   float  frameRate=0;
11:   float  myTime=0;
12:   int myIndex=0;
13:
14:    void Start()
15:   {
16:     frameRate=1.0f/frameNumber;
17:    }
18:
19:    void Update()
20:   {
21:     myTime+=Time.deltaTime;
22:     myIndex=(int)(myTime*frameNumber);
23:     index=myIndex % frameNumber;
24:
25:     renderer.material.mainTextureScale=new Vector2(frameRate,1);
26:     renderer.material.mainTextureOffset=new Vector2(index*frameRate,0);
27:
28:      if(index==frameNumber-1)
29:        Destroy(gameObject);
30:   }
31:}

在上述C#代码中,第25行、第26行是关键语句,第25行语句设置Tiling属性,该属性是一个2D矢量值;第26行语句设置Offset属性,该属性也是一个2D矢量值。

在Tiling属性中,X=1.0f/frameNumber,也就是每一帧图片的宽度;在Offset属性中,X=index*frameRate,每次偏移一帧图片的宽度,从而显示第一帧、第二帧直到第七帧爆炸图片,从而形成爆炸的动画效果,当显示完毕第七帧图片时(代码第28行),则执行第29行语句,自动删除爆炸效果对象。

代码第21行获得爆炸效果运行的整个累计时间,通过22行将该时间乘以图片的帧数(这里为7),然后将最后的结果整型化,通过执行第23语句,将整型化的数据除以图片的帧数,求其余数,依次获得index的数值分别为0、1、2直到6。

将上述代码拖放到层次Hierarchy窗格中的explosionEnemy对象之上,以便后面运行爆炸效果。

对于JavaScript开发者来说,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“Javascript” 命令,创建一个JavaScript文件,设置该文件的名称为explosionController.js文件。在explosionController.js中书写实现爆炸动画的代码,见代码2-26。

代码2-26 explosionController的JavaScript代码

1: var index:int=0;
2: var frameNumber:int=7;
3:
4: private var frameRate:float=0;
5: private var myTime:float=0;
6: private var myIndex:int =0;
7:
8: function Start()
9: {
10:   frameRate=1.0f/frameNumber;
11: }
12:
13: function Update()
14: {
15:   myTime+=Time.deltaTime;
16:   myIndex=myTime*frameNumber;
17:   index=myIndex%frameNumber;
18:
19:   renderer.material.mainTextureScale=new Vector2(frameRate,1);
20:   renderer.material.mainTextureOffset=new Vector2(index*frameRate,0);
21:
22:   if(index==frameNumber-1)
23:    Destroy(gameObject);
24: }

在上述JavaScript代码中,第19行、第20行是关键语句,第19行语句设置Tiling属性,该属性是一个2D矢量值;第20行语句设置Offset属性,该属性也是一个2D矢量值。

在Tiling属性中,X=1.0f/frameNumber,也就是每一帧图片的宽度;在Offset属性中,X=index*frameRate,每次偏移一帧图片的宽度,从而显示第一帧、第二帧直到第七帧爆炸图片,从而形成爆炸的动画效果,当显示完毕第七帧图片时(代码第22行),则执行第23行语句,自动删除爆炸效果对象。

代码第15行获得爆炸效果运行的整个累计时间,通过16行将该时间乘以图片的帧数(这里为7),然后将最后的结果整型化,通过执行第17语句,将整型化的数据除以图片的帧数,求其余数,依次获得index的数值分别为0、1、2直到6。

将上述代码拖放到层次Hierarchy窗格中的explosionEnemy对象之上,以便后面运行爆炸效果。

运行游戏,可以看到:此时会出现爆炸效果的动画,在持续时间大约为1秒之后,就自动销毁了。

3.添加爆炸声音

在项目Project窗格中,选择sound文件夹中的explosionEnemy声音文件,拖放该文件到层次Hierarchy窗格中的explosionEnemy对象之上,这样就可以在实现爆炸效果动画的时候播放爆炸声音了,如图2-93所示。

图2-93 设置爆炸声音

此时运行游戏,可以看到:会出现爆炸效果的动画,并伴随爆炸的声音,在持续时间大约为1秒之后,就自动销毁了。

4.创建爆炸预制件

前面已经创建了爆炸动画,并添加了爆炸的声音,下面来说明如何创建爆炸预制件,以便炮弹与陨石发生碰撞时调用。

在图2-94中,在层次Hierarchy窗格中,选择已经创建的explosionEnemy对象,直接拖放到prefabs中去,此时就会在prefabs文件夹中创建一个预制件爆炸效果explosionEnemy。

图2-94 创建explosionEnemy预制件

2.7.2 飞机与陨石碰撞的爆炸效果

下面讲解如何实现飞机与陨石碰撞所发生的爆炸效果。

1.设置爆炸效果

爆炸图片位于Image文件夹中,名称为“explosionPlayer”,是一个5帧图像的图片,如图2-95所示。

图2-95 explosionPlayer序列爆炸图片

在默认情况下,该图片的Texture Type设置为Texture,如图2-96所示。

图2-96 默认的图片设置

为了得到原始图片的真实尺寸大小,提高图片的清晰度,这里需要重新设置图片的Texture Type。

在图2-97中,选择Texture Type为Advanced, Non Power of 2为None,最底部的属性Format为Automatic Truecolor,最后单击“Apply”按钮,即可完成新的设置,此时在Preview预览窗口中显示图片原始的尺寸大小为210×43像素。也就是说,对于每帧的爆炸图片,大小为42×43像素。

图2-97 设置爆炸序列图片

在项目Project窗格中,首先选择prefabs文件夹中的sprite对象,直接拖放该对象到层次Hierarchy窗格中,此时将该对象的名称修改为explosionPlayer;然后将Image文件夹下的explosionPlayer图片,拖放到层次Hierarchy窗格中的explosionPlayer对象之上,设置explosionPlayer对象的Position参数为:X=1, Y=0.5, Z=0; Scale参数为:X=0.84, Y=0.86, Z=1,如图2-98所示。

图2-98 设置爆炸图片

在图2-98中,设置Tiling属性下的X=0.20,表示是五张图片之一(1/5);设置Offset属性的X=0.6,则会显示第四帧爆炸图片。

在图2-99中,对于C#开发者来说,选择项目Project窗格Script文件夹中的ExplosionController.cs代码文件,拖放到层次Hierarchy窗格中的explosionEnemy对象之上,在检视器中设置FrameNumber为数值5,以便后面运行爆炸效果。

图2-99 拖放代码ExplosionController.cs

在图2-100中,对于JavaScript开发者来说,选择项目Project窗格Script文件夹中的explosionController.js代码文件,拖放到层次Hierarchy窗格中的explosionEnemy对象之上,在检视器中设置FrameNumber为数值5,以便后面运行爆炸效果。

图2-100 拖放代码explosionController.js

运行游戏,可以看到:此时会出现新的爆炸效果的动画,在持续时间大约为1秒之后,就自动销毁了。

2.添加爆炸声音

在项目Project窗格中,选择sound文件夹中的explosionPlayet声音文件,拖放该文件到层次Hierarchy窗格中的explosionPlayer对象之上,这样就可以在实现爆炸效果动画的时候播放爆炸声音了,如图2-101所示。

图2-101 设置爆炸声音

此时运行游戏,可以看到:会出现爆炸效果的动画,并伴随爆炸的声音,在持续时间大约为1秒之后,就自动销毁了。

3.创建爆炸预制件

在图2-102中,在层次Hierarchy窗格中,选择已经创建的explosionPlayer对象,直接拖放到prefabs文件夹中去,此时就会在prefabs文件夹中创建一个预制件爆炸效果explosionPlayer。

图2-102 创建explosionPlayer预制件

2.7.3 实现爆炸效果

要实现炮弹与陨石碰撞所发生的爆炸效果,以及炮弹与飞机碰撞所发生的爆炸效果,就需要在碰撞检测中添加相关代码,调用前面已经制作好的爆炸预制件。

对于C#开发者来说,在RockController.cs中添加相关代码实现爆炸效果,见代码2-27。

代码2-27 RockController的C#代码

1: using UnityEngine;
2: using System.Collections;
3:
4: public class RockController : MonoBehaviour
5: {
6:   public float speed=2.0f;
7:   public GameObject explosionEnemy;
8:   public GameObject explosionPlayer;
9:   void Update()
10:  {
11:     transform.Translate(0, -speed*Time.deltaTime,0);
12: }
13: }
14:
15: function OnTriggerEnter (other : Collider)
16: {
17:   if(other.tag=="projectile")
18:   {
19:    transform.position=new Vector3(Random.Range(-2.1f,2.1f),3.5f,0);
20:    Destroy(other.gameObject);
21:    Instantiate(explosionEnemy, transform.position, transform.rotation);
22:   }
23:
24:   if(other.tag=="Player")
25:    {
26:     Instantiate(explosionPlayer, transform.position, transform.rotation);
27:     transform.position=new Vector3(Random.Range(-2.1f,2.1f),3.5f,0);
28:    }
29: }

在上述C#代码中,与代码2-23相比较,添加了第7行、第8行语句,用于设置公有的爆炸变量,以便开发者在检视器中关联刚刚完成的2个爆炸效果预制件。

在添加的第21行代码中,通过Instantiate()方法,当炮弹碰撞陨石时,调用炮弹碰撞陨石所发生的爆炸效果。

在添加的第26行代码中,通过Instantiate()方法,当陨石碰撞飞机时,调用陨石碰撞飞机所发生的爆炸效果。

在图2-103中,拖放爆炸预制件explosionEnemy、explosionPlayer到上述代码的变量explosionEnemy、explosionPlayer的右边,以便代码分别调用爆炸预制件。

图2-103 拖放爆炸预制件

对于JavaScript开发者来说,在rockController.js中添加相关代码实现爆炸效果,见代码2-28。

代码2-28 rockController的JavaScript代码

1: var speed:float=2.0f;
2: var explosionEnemy:GameObject;
3: var explosionPlayer:GameObject;
4: function Update(){
5:   transform.Translate(0, -speed*Time.deltaTime,0);
6: }
7:
8: function OnTriggerEnter (other : Collider)
9: {
10:   if(other.tag=="projectile")
11:   {
12:    transform.position=new Vector3(Random.Range(-2.1f,2.1f),3.5f,0);
13:    Destroy(other.gameObject);
14:    Instantiate(explosionEnemy, transform.position, transform.rotation);
15:   }
16:
17:   if(other.tag=="Player")
18:   {
19:     Instantiate(explosionPlayer, transform.position, transform.rotation);
20:     transform.position=new Vector3(Random.Range(-2.1f,2.1f),3.5f,0);
21:    }
22: }

在上述JavaScript代码中,与代码2-24相比较,添加了第2行、第3行语句,用于设置公有的爆炸变量,以便开发者在检视器中关联刚刚完成的2个爆炸效果预制件。

在添加的第14行代码中,通过Instantiate()方法,当炮弹碰撞陨石时,调用炮弹碰撞陨石所发生的爆炸效果。

在添加的第20行代码中,通过Instantiate()方法,当陨石碰撞飞机时,调用陨石碰撞飞机所发生的爆炸效果。

在图2-104中,拖放爆炸预制件explosionEnemy、explosionPlayer到上述代码的变量explosionEnemy、explosionPlayer的右边,以便代码分别调用爆炸预制件。

图2-104 拖放爆炸预制件

运行游戏,当炮弹击中陨石时,陨石消失,并发生爆炸,如图2-105所示;当陨石砸中飞机时,陨石消失,同样发生爆炸,如图2-106所示。

图2-105 炮弹击中陨石的爆炸

图2-106 陨石砸中飞机的爆炸