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

2.3 发射炮弹

要实现发射炮弹,首先需要创建炮弹,创建跑单的预制件,然后通过Instantiate方法发射炮弹。

2.3.1 创建炮弹

下面介绍创建炮弹,实现炮弹移动,添加炮弹被发射的声音以及炮弹的销毁。

1.新建炮弹对象

在项目Project窗格中,首先选择prefabs文件夹中的sprite对象,直接拖放该对象到层次Hierarchy窗格中,然后将该对象的名称修改为projectile,以便作为炮弹对象,如图2-59所示。

图2-59 拖放sprite对象

为了在Unity3D中显示炮弹,在图2-60中拖放projectile图片到右下方的图片框中,并设置Shader为 “Transprent” → “Diffuse”,设置图片背景透明化,然后设置Position参数: X=0, Y=1, Z=0; Scale参数:X=0.2, Y=0.5, Z=1。

图2-60 拖放图片

此时在游戏Game窗格中就会显示该炮弹对象,如图2-61所示。

图2-61 显示炮弹

2.炮弹移动

为实现炮弹移动,下面需要编写代码。

对于C#开发者来说,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“C# Script”命令,创建一个C#文件,该文件的名称设置为ProjectileController。

ProjectileController的C#代码文件,见代码2-7。

代码2-7 ProjectileController的C#代码

1: using UnityEngine;
2: using System.Collections;
3:
4: public class ProjectileController : MonoBehaviour
5: {
6:  public float speed=5.0f;
7:
8:   void Update()
9:  {
10:    transform.Translate(0, speed*Time.deltaTime,0);
11:   }
12: }

在上述C#代码中,由于炮弹的运动方向是沿着y轴运动,因此第10行的Translate方法在y轴方向的移动是speed*Time.deltaTime,也就是速度乘以时间等于距离。

将上述代码拖放到层次Hierarchy窗格中的projectile对象之上,如果代码没有编译错误,则可以成功拖放。

对于JavaScript开发者来说,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“Javascript”命令,创建一个JavaScript文件,该文件为projectileController.js文件。

projectileController的JavaScript代码文件,见代码2-8。

代码2-8 projectileController的JavaScript代码

1: var speed:float=5.0f;
2: function Update()
3: {
4:    transform.Translate(0, speed*Time.deltaTime,0);
5: }

在上述JavaScript代码中,由于炮弹的运动方向是沿着y轴运动,因此第4行的Translate方法在y轴方向的移动是speed*Time.deltaTime,也就是速度乘以时间等于距离。

将上述代码拖放到层次Hierarchy窗格中的projectile对象之上,如果代码没有编译错误,则可以成功拖放。

此时单击Unity3D中的运行按钮,运行游戏,炮弹就会自动向上快速移动。

3.炮弹声音

在项目Project窗格中,选择sound文件夹中的Shoot声音文件,在图2-62中,单击右下方的播放按钮,即可播放指定的声音文件。

图2-62 播放炮弹声音

在图2-63中,选择Shoot声音文件,拖放该文件到层次Hierarchy窗格中的projectile对象之上,这样就可以让炮弹播放声音了。

图2-63 添加炮弹声音

此时单击Unity3D中的运行按钮,运行游戏,炮弹会播放被发射的声音,并且会自动向上快速移动。

4.炮弹销毁

在游戏中,炮弹可以不断被发射,为防止数量众多的炮弹一直向上移动,这里需要将离开屏幕的炮弹销毁。

为寻找炮弹向上移动离开屏幕的边界,调整Y轴的数值,慢慢向上移动炮弹,如图2-64所示,设置Y轴的边界值为3.5。

图2-64 寻找炮弹向上移动离开屏幕的边界

对于C#开发者来说,在ProjectileControllerd的C#代码文件中,添加销毁炮弹的相关代码,见代码2-9。

代码2-9 ProjectileController的C#代码

1: using UnityEngine;
2: using System.Collections;
3:
4: public class ProjectileController : MonoBehaviour
5: {
6:  public float speed=5.0f;
7:
8:   void Update()
9:  {
 10:    transform.Translate(0, speed*Time.deltaTime,0);
 11:
 12:    if(transform.position.y>3.5f)
 13:      Destroy(gameObject);
 14:   }
 15: }

在上述C#代码中,第12行检测炮弹是否离开屏幕上方,如果离开了屏幕,第13行就会销毁炮弹。

对于JavaScript开发者来说,在projectileController的JavaScript代码文件中,添加销毁炮弹的相关代码,见代码2-10。

代码2-10 projectileController的JavaScript代码

1: var speed:float=5.0f;
2: function Update()
3: {
4:    transform.Translate(0, speed*Time.deltaTime,0);
5:
6:    if(transform.position.y>3.5f)
7:      Destroy(gameObject);
8: }

在上述JavaScript代码中,添加了第6行、第7行代码,第6行检测炮弹是否离开屏幕上方,如果离开了屏幕,第7行就会销毁炮弹。

在Unity3D中单击运行按钮,运行游戏,炮弹会播放被发射的声音,并且会自动向上快速移动,当炮弹离开屏幕上方时,炮弹就会被销毁,此时在项目Project窗格中的projectile对象也会被销毁。

2.3.2 发射炮弹

为实现发射多个炮弹,在Unity3D中首先需要创建预制件prefab对象,然后通过Instantiate方法即可在指定位置发射炮弹。

1.创建预制件炮弹

要创建预制件炮弹prefab,或者说是可重用的炮弹对象,在图2-65中,在层次Hierarchy窗格中,选择前面已经创建的projectile对象,直接拖放到prefabs中去,此时就会在prefabs文件夹中创建一个预制件炮弹projectile。

图2-65 创建prefab炮弹

2.发射炮弹

在Unity3D中,通过Instantiate()方法,就可以实现发射前面所创建的预制件炮弹。

对于C#开发者来说,要实现发射炮弹,需要找到前面代码2-5中的PlayerController.cs文件,在其中添加相关代码,见代码2-11。

代码2-11 PlayerController的C#代码

1: using UnityEngine;
2: using System.Collections;
3:
4: public class PlayerController: MonoBehaviour
5: {
6:  public float speed=2.0f;
7:  public GameObject projectile;
8:   void Update()
9:  {
10:    if(transform.position.x < 3.2f && transform.position.x >-3.2f)
11:       transform.Translate(
              speed*Input.GetAxis("Horizontal")*Time.deltaTime,0,0);
12:
13:    if(transform.position.x<=-3.2f)
14:        transform.position=new Vector3(3.1f,
              transform.position.y, transform.position.z);
15:
16:    if(transform.position.x>=3.2f)
17:        transform.position=new Vector3 (-3.1f,
              transform.position.y, transform.position.z);
18:
19:    if(Input.GetKeyDown(KeyCode.Space))
20:        Instantiate(projectile, transform.position, transform.rotation);
21:
20:}

在上述C#代码中,与代码2-5相比较,添加了第7行代码和第19行、第20行代码。

第7行代码设置了炮弹对象projectile,访问属性设置为公有,以便开发者在监视器中设置关联的预制件炮弹;第19行通过判断用户是否按下Space键,如果按下Space键,则执行第20行语句,动态创建炮弹对象,从而实现发射炮弹。

在Instantiate方法动态创建炮弹时,需要输入三个参数,它们分别是需要创建的对象,如炮弹projectile,一般情况下都是预制件;需要在什么位置创建该炮弹,这里的位置是飞机画面的中部;最后一个是以什么角度发射这个炮弹,这里设置的角度与飞机一样。

对于JavaScript开发者来说,要实现发射炮弹,需要找到前面代码2-6中的playerController.js文件,在其中添加相关代码,见代码2-12。

代码2-12 playerController的JavaScript代码

1: var speed:float=2.0f;
2: var projectile:GameObject;
3: function Update()
4: {
5:    if(transform.position.x>-3.2f && transform.position.x<3.2f)
6:      transform.Translate(
          speed*Input.GetAxis("Horizontal")*Time.deltaTime,0,0);
7:
8:    if(transform.position.x<=-3.2f)
9:      transform.position.x=3.1f;
10:
11:    if(transform.position.x>=3.2f)
12:      transform.position.x=-3.1f;
13:
14:    if(Input.GetKeyDown(KeyCode.Space))
15:       Instantiate(projectile, transform.position, transform.rotation);
13: }

在上述JavaScript代码中,与代码2-6相比较,添加了第2行代码和第14行、第15行代码。

第2行代码设置了炮弹对象projectile,访问属性设置为公有,以便开发者在监视器中设置关联的预制件炮弹;第14行通过判断用户是否按下Space键,如果按下Space键,则执行第15行语句,动态创建炮弹对象,从而实现发射炮弹。

在Instantiate方法动态创建炮弹时,需要输入三个参数,它们分别是需要创建的对象,如炮弹projectile,一般情况下都是预制件;需要在什么位置创建该炮弹,这里的位置是飞机画面的中部;最后一个是以什么角度发射这个炮弹,这里设置的角度与飞机一样。

在图2-66中,在项目Project窗格中选择Player对象,然后选择层次Hierarchy窗格中的projectile对象,将该炮弹对象拖放到检视器C#代码PlayerController或者JavaScript代码playerController中的公有属性projectile变量的右边,以便代码可以实例化炮弹。

图2-66 设置关联prefab炮弹

这里需要说明的是,在Unity3D中,这种拖放相关预制件对象,实现对象相关联的方法,非常重要,大家要逐步深入理解。

在Unity3D中单击运行按钮,运行游戏,不断按下Space键,不断发射炮弹,此时在项目Project窗格中也显示多个projectile(Clone)对象,如图2-67所示,随着炮弹离开屏幕,这些炮弹就会被销毁。

图2-67 发射炮弹