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 发射炮弹