和子弹相反,我们希望敌机从屏幕上方以一定速度向下移动,当碰到玩家飞机或者子弹时,将降低生命值。为此,我们这样定义敌机的脚本:
using UnityEngine; using System.Collections; public class Enemy : MonoBehaviour { //移动速度 public float MoveSpeed=1.5F; //爆炸 public GameObject Explosion; //最大生命值 public int MaxHP=100; void Update () { //移动飞机 transform.Translate(Vector3.forward*Time.deltaTime*MoveSpeed); } public void Hit(int Value) { //如血量不低于0。则敌人飞机掉血 if(MaxHP>0) { MaxHP-=Value; }else { //产生爆炸效果 Instantiate(Explosion,transform.position,Quaternion.Euler(new Vector3(90,180,0))); //销毁敌机 Destroy(this.gameObject); } } void OnTriggerEnter(Collider mCollider) { //假设与玩家飞机遭遇。则两方减血 if(mCollider.gameObject.tag=="Player") { //敌机掉血 this.Hit(2); //玩家飞机掉血 Transform mPlayer=mCollider.gameObject.transform.Find("Player"); mPlayer.GetComponent<Player>().Hit(2); } } void OnBecameInvisible() { Destroy(this.gameObject); } } 接下来。我们通过敌机生成器来不断地生成敌机。敌人生成器是我们预制在游戏场景中的空游戏体,它位于游戏场景的顶部。
我们将以下的脚本绑定到游戏生成器 上,使其能够不断地生成敌人:
using UnityEngine; using System.Collections; public class SpawnEnemy : MonoBehaviour { //定义敌人速度 public float SpawnTime=1.0f; //定义敌人对象数组 public GameObject[] Enemys; void Start () { StartCoroutine("Spawn"); } //通过迭代器生成敌人 IEnumerator Spawn() { //等待 yield return new WaitForSeconds(SpawnTime); //克隆对象 Instantiate(Enemys[Random.Range(0,3)],new Vector3(transform.position.x * Random.Range(-1F,1F), transform.position.y,-4),Quaternion.Euler(new Vector3(90,180,0))); StartCoroutine("Spawn"); } } 当中Enemys相应到我们的敌人预设,每隔一段时间,我们随机地产生一种敌人,该敌人将从屏幕上方缓缓向下移动。
四、碰撞检測
在这个游戏中。主要存在子弹与敌机的碰撞、玩家飞机与敌机的碰撞两种形式。
它们分别被定义在Bullet.cs和Enemy.cs两个类文件里。
//碰撞事件捕捉 void OnTriggerEnter(Collider mCollider) { if(mCollider.gameObject.tag=="Enemy") { //敌人减血 mCollider.gameObject.GetComponent<Enemy>().Hit(Damage); //我方得分 Player.GetComponent<Player>().Add(1); //销毁子弹 Destroy(this.gameObject); } }void OnTriggerEnter(Collider mCollider) { //假设与玩家飞机遭遇。则两方减血 if(mCollider.gameObject.tag=="Player") { //敌机掉血 this.Hit(2); //玩家飞机掉血 Transform mPlayer=mCollider.gameObject.transform.Find("Player"); mPlayer.GetComponent<Player>().Hit(2); } }五、爆炸特效
当敌机被摧毁时,将显示爆炸特效,我们这里採用一组2D贴图来实现爆炸特效,原理是改变贴图的mainTextureScale和mainTextureOffset两个属性值。我们来一起看代码:
using UnityEngine; using System.Collections; public class Explosion : MonoBehaviour { //动画序列索引 private int index=0; //声音 private AudioSource mAudio; void Start() { mAudio=GetComponent<AudioSource>(); } void FixedUpdate () { if(index<8) { this.renderer.sharedMaterial.mainTextureScale=new Vector2(1.0F/8,1); this.renderer.sharedMaterial.mainTextureOffset=new Vector2(index * 1.0F/8,0); index+=1; }else { mAudio.Play(); Destroy(this.gameObject); } } } 当中mAudio相应到一个AudioSource组件,我们在这里指定一个爆炸的音效。相同地,我们将爆炸制作成预设。该预设相应于Enemy.cs中的Explosion。好了。到这里今天的 内容就解说完了,我们一起来看看终于的效果吧!
希望今天的内容大家能够喜欢。