2.5 背景移动
在太空射击游戏项目中,为模拟太空环境,在游戏界面中设置了太空背景,从上到下垂直向下缓慢移动。
2.5.1 单个背景移动
在图2-71中,在项目Project窗格中选择sprite对象,拖放到层次Hierarchy窗格中,并修改名称为 “background1”,然后拖放Stars图片到background1,调整background1的Scale参数:X=6, Y=6, Z=1;将background1的Position参数设置为:X=0, Y=0, Z=1。
图2-71 设置背景
此时太空背景消失了,不再显示在游戏Game界面中。在层次Hierarchy窗格中选择“Main Camera”对象,设置该摄像机的Position参数设置为:X=0, Y=1, Z=-8。
此时就会正常显示太空背景,并且太空背景在陨石、飞机和炮弹游戏对象(它们的Z=0)的后面。
在太空背景向下移动过程中,同样需要知道太空背景离开屏幕底部的边界参数,经过测试后发现,Y=-3.9。
对于C#开发者来说,在项目Project窗格中新建一个BackgroundController.cs文件,实现背景移动的代码,见代码2-17。
代码2-17 BackgroundController的C#代码
1: using UnityEngine; 2: using System.Collections; 3: 4: public class BackgroundController : MonoBehaviour 5: { 6: public float speed=1.0f; 7: 8: void Update() 9: { 10: 11: transform.Translate(0, -speed*Time.deltaTime,0); 12: 13: if(transform.position.y<-3.9f) 14: transform.position=new Vector3(0,0,1); 15: 16: } 17: }
在上述C#代码中,第11行实现背景的向下移动;第13行代码判断背景是否超出屏幕底部,如果超出屏幕底部,则执行第14行代码,重新设置背景的起始位置,以便背景重新向下移动。
将上述代码拖放到background1对象之上,以便背景运行上述代码。
对于JavaScript开发者来说,在项目Project窗格中新建一个backgroundController.js文件,实现背景移动的代码,见代码2-18。
代码2-18 backgroundController的JavaScript代码
1: var speed:float=1.0f; 2: 3: function Update() 4: { 5: transform.Translate(0, -speed*Time.deltaTime,0); 6: 7: if(transform.position.y<-3.9f) 8: transform.position=new Vector3(0,0,1); 9: }
在上述JavaScript代码中,第5行实现背景的向下移动;第7行判断陨石移动是否超出Y轴的底部边界,如果超出底部屏幕,则执行第8行代码,重新设置陨石在屏幕上方的位置,以便背景重新向下移动。
将上述代码拖放到background1对象之上,以便背景运行上述代码。
运行游戏,此时会看到:太空背景可以循环向下移动,不过会出现空白的背景。
2.5.2 两个背景循环移动
为实现背景不断向下循环移动,需要再添加一个背景。
在图2-72中,在项目Project窗格中选择sprite对象,拖放到层次Hierarchy窗格中,并修改名称为“background2”,然后拖放Stars_large图片到background2,调整background2的Scale参数:X=6, Y=6;将background2的Position参数设置为:X=0, Y=6, Z=1。
图2-72 设置第二个背景
此时就会在游戏场景Scene窗格中,显示两个无缝连接的太空背景。
对于C#开发者来说,修改BackgroundController.cs文件之后,见代码2-19。
代码2-19 BackgroundController的C#代码
1: using UnityEngine; 2: using System.Collections; 3: 4: public class BackgroundController : MonoBehaviour 5: { 6: public float speed=1.0f; 7: 8: void Update() 9: { 10: 11: transform.Translate(0, -speed*Time.deltaTime,0); 12: 13: if(transform.position.y<-3.9f) 14: transform.position=new Vector3(0,8,1); 15: 16: } 17: }
在上述C#代码中,与代码2-17相比较,只是修改了第14行代码。当背景超出屏幕底部时,需要重新设置背景的起始位置,该位置是在另外一张背景图片的上方,以便无缝连接,此时的初始位置Y应该设置为8。
将上述代码拖放到background2对象之上,以便背景运行上述代码。
对于JavaScript开发者来说,修改backgroundController.js文件之后,见代码2-20。
代码2-20 backgroundController的JavaScript代码
1: var speed:float=1.0f; 2: 3: function Update() 4: { 5: transform.Translate(0, -speed*Time.deltaTime,0); 6: 7: if(transform.position.y<-3.9f) 8: transform.position=new Vector3(0,8,1); 9: }
在上述JavaScript代码中,与代码2-18相比较,只是修改了第8行代码。当背景超出屏幕底部时,需要重新设置背景的起始位置,该位置是在另外一张背景图片的上方,以便无缝连接,此时的初始位置Y应该设置为8。
将上述代码拖放到background2对象之上,以便背景运行上述代码。
运行游戏,此时会看到:太空背景可以循环向下移动,不再出现空白的背景。