Unity飞机大战(2) 陨石的自转 碰撞+敌机的控制和碰撞+敌机的子弹碰撞

陨石

1.首先有三种陨石,每一种都添加刚体和碰撞框
2.把重力的√取消掉,并全部勾选isTrigger 用于后面的碰撞触发
如图:
在这里插入图片描述

此脚本挂在三个陨石预制体上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AsteroidCtr : MonoBehaviour {

	// Use this for initialization
    public float RotationSpeed; //定义陨石的旋转速度
    public int Score;
    public float MoveSpeed; //定义陨石的移动速度
    public GameObject Boll;

    private int _axis; //私有一个变量  用于下面三目运算符的判断
    private Rigidbody _rig;
    private CreateGameManagerCtr _createGameManager;
    private AudioManagerCtr _audioManager;
    private ScoreManager _scoreManager;
	void Start ()
	{
	   //从TagManager中找到 并得到脚本
	    _scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
	    _audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
	    _createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
	    _rig = GetComponent<Rigidbody>();
	    if (null == _rig)
	    {
	        _rig = gameObject.AddComponent<Rigidbody>();
	    }
	    if (RotationSpeed == 0)
	    {
	        RotationSpeed = 250;
	    }
	    if (MoveSpeed == 0)
	        MoveSpeed = 6;
	    _rig.useGravity = false;
        _rig.velocity = Vector3.back*MoveSpeed;
	    _axis = Random.Range(0, 2);  //用于下面的三目运算符的判断
	}
	
	// Update is called once per frame
	void Update () {
	//三目运算符  如果_axis=0 绕X轴转 否则绕Z轴转 
        transform.RotateAround(transform.localPosition, (_axis == 0) ? transform.right : transform.forward, RotationSpeed * Time.deltaTime);
		
	}

    private void OnTriggerEnter(Collider other)
    {
        if(_createGameManager.PlayerOver)
            return;
    // 销毁对方
        //销毁自己
        //通知管理释放粒子特效
        if (other.tag.Equals(TagManager.PlayBulletName))  //如果碰撞到自身的是玩家子弹
        {
            
            _createGameManager.CreateParticleByV3AndIndex(other.transform.position,2);//实例化爆炸特效
            _audioManager.PlayAudio(3,AudioName.EnemyKill);//陨石爆炸音效
            _scoreManager.AddScore(Score);//得分
            Destroy(other.gameObject);//销毁子弹
            Destroy(gameObject);//销毁陨石自身
            if (Boll != null)
            {
            //实例化特效球
         GameObject tmp =       Instantiate(Boll, transform.position, Quaternion.identity);
                Destroy(tmp,3); //3s钟后销毁特效球
            }
        }//PlyaerBulletEnd


        if (other.tag.Equals(TagManager.PlayName))  //如果碰撞到自身的是玩家飞机
        {
            if (_createGameManager.PlayerIsProtected)  //玩家飞机处于保护无敌状态
            {
              //则只销毁自身
                _createGameManager.CreateParticleByV3AndIndex(other.transform.position, 2);
                _audioManager.PlayAudio(3, AudioName.EnemyKill);
                _scoreManager.AddScore(Score);
                Destroy(gameObject);
                if (Boll != null)
                {
                    GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
                    Destroy(tmp, 3);
                }
                 return;                
            }
            //否则
            //实例化粒子特效
            _createGameManager.CreateParticleByV3AndIndex(other.transform.position, 2);
            _createGameManager.CreateParticleByV3AndIndex(other.transform.position, 0);
            //声音管理
            _audioManager.PlayAudio(3, AudioName.EnemyKill);
            _audioManager.PlayAudio(1, AudioName.PlyerKill);
            //分数++
            _scoreManager.AddScore(Score);
           //玩家死亡
            Destroy(other.gameObject);
            Destroy(gameObject);
            _audioManager.StopGame();
            _createGameManager.StopGame();
            _scoreManager.StopGame();
        }
    }
}

敌机的控制和碰撞脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyShipCtr : MonoBehaviour
{

    public int Score;
    public int MoveSpeed;
    public GameObject EnemyBullet;
    public float FireTime;
    public Texture ChangeTexture;
    public int Left; // -1 1 
    public GameObject Boll;
    
    private CreateGameManagerCtr _createGameManager;
    private AudioManagerCtr _audioManager;
    private ScoreManager _scoreManager;
    private Rigidbody _rig;
    private int _bulletCount;
    private float _timer;
    
	void Start ()
	{
	    _scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
	    _audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
	    _createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
	    if (FireTime == 0)
	    {
	        FireTime = 0.8f;
	    }
        transform.rotation = Quaternion.Euler(0,180,0); //让敌机旋转180  朝下飞
	    _rig = GetComponent<Rigidbody>();
	    if (_rig == null)
	    {
	        _rig = gameObject.AddComponent<Rigidbody>();
	    }
	    if (MoveSpeed == 0)
	        MoveSpeed = 5;
	    _rig.useGravity = false;

        ChangeDir();
	}
	
	// Update is called once per frame
	void Update ()
	{

      if(_createGameManager.PlayerOver)
          return;
	    _timer += Time.deltaTime;
        if(_timer >= FireTime)
        {
            _timer = 0;
            _bulletCount++;
            //实例化敌机子弹和音效
         GameObject tmpGameObject =    Instantiate(EnemyBullet, transform.Find("BulletPos").position, Quaternion.identity);
            _audioManager.PlayAudio(2,AudioName.EnemyShipShoot);
            tmpGameObject.GetComponent<EnemyBulletCtr>().MoveSpeed = Random.Range(8, 17); //敌机子弹速度
            if (_bulletCount % 3 == 0) //敌机发射子弹  每第三发是一枚特殊子弹 不可被玩家子弹所抵消
            {
                //不能相互抵消
                tmpGameObject.GetComponent<EnemyBulletCtr>().IsDes = false;
                tmpGameObject.GetComponent<MeshRenderer>().material.mainTexture = ChangeTexture; 
            }
            else
            {
                //抵消
                tmpGameObject.GetComponent<EnemyBulletCtr>().IsDes = true;
            }
        }
	}

    private void ChangeDir()
    {
        //0 敌机往左边飘
        //1 敌机不动垂直下落
        //2 敌机往右边飘
        //超出边界就直接反向
        switch (Left)
        {
            case 0:
                _rig.velocity = (transform.forward * MoveSpeed + transform.right * Random.Range(1, 4));
                break;
            case 1:
                _rig.velocity = (transform.forward * MoveSpeed);

                break;
            case 2:
                _rig.velocity = (transform.forward * MoveSpeed + -transform.right * Random.Range(1, 4));

                break;

        }
    }

    private void OnTriggerEnter(Collider other)  
    {
        //敌人
        if(_createGameManager.PlayerOver) 
            return;
        //玩家
        if (other.tag.Equals(TagManager.PlayName))  //与敌机自身碰撞的是玩家飞机
        {
            //玩家爆炸
            if (_createGameManager.PlayerIsProtected)  //如果玩家处于无敌保护状态
            {
                _createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);
                _audioManager.PlayAudio(2, AudioName.EnemyShipKill);
                Destroy(gameObject);
                _scoreManager.AddScore(Score);
                if (Boll != null)
                {
                    GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
                    Destroy(tmp, 3);
                }
                return;                
            }
            // 否则
            _createGameManager.CreateParticleByV3AndIndex(other.gameObject.transform.position, 0);
            _createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);

            _audioManager.PlayAudio(1, AudioName.PlyerKill);
            _audioManager.PlayAudio(2, AudioName.EnemyShipKill);
            
            //音效
            //互毁
            Destroy(gameObject);
            Destroy(other.gameObject);
            _scoreManager.AddScore(Score);
            //over
            _createGameManager.StopGame();
            _audioManager.StopGame();
            _scoreManager.StopGame();
        }//EndPlayer

        if (other.tag.Equals(TagManager.PlayBulletName))  //如果与敌机碰撞的是玩家子弹
        {

            _createGameManager.CreateParticleByV3AndIndex(gameObject.transform.position, 1);
            _audioManager.PlayAudio(2, AudioName.EnemyShipKill);
            Destroy(gameObject);
            Destroy(other.gameObject);
            _scoreManager.AddScore(Score);
            if (Boll != null)
            {
            //实例化特效球
                GameObject tmp = Instantiate(Boll, transform.position, Quaternion.identity);
                Destroy(tmp, 3);   //3s钟后特效球消失
            }
        }//EndPlayBullet

    }

    void FixedUpdate()  //用于物理更新
    {
        if (_rig.transform.position.x < -6.5)  //设置左边边界  超出便反向
        {
            _rig.velocity = (transform.forward * MoveSpeed + -transform.right * Random.Range(1, 4));
        }
        if (_rig.transform.position.x > 6.5)  //设置右边边界  超出便反向
        {
            _rig.velocity = (transform.forward * MoveSpeed + transform.right * Random.Range(1, 4));
            
        }
    }
}

敌机子弹脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyBulletCtr : MonoBehaviour {

    public int MoveSpeed;
    public bool IsDes;

    private CreateGameManagerCtr _createGameManager;
    private AudioManagerCtr _audioManager;
    private ScoreManager _scoreManager;
    private Rigidbody _rig;
	void Start ()
	{
	//让子弹旋转90  能朝下飞
        transform.rotation = Quaternion.Euler(90,0,0);
	    _scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
	    _audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
	    _createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();
	   
	    _rig = GetComponent<Rigidbody>();
	    if (null == _rig)
	    {
	        _rig = gameObject.AddComponent<Rigidbody>();
	    }
	    if (MoveSpeed == 0)
	        MoveSpeed = 10;
	    _rig.useGravity = false;
	    _rig.velocity = transform.up * -MoveSpeed;
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag.Equals(TagManager.PlayName)) //如果与自身碰撞的是玩家
        {
            if (_createGameManager.PlayerIsProtected)  //玩家处于无敌被保护状态
            {
                Destroy(gameObject);  //只销毁敌机子弹自身
                return;
            }
            //玩家爆炸
            _createGameManager.CreateParticleByV3AndIndex(other.gameObject.transform.position,0);
            _audioManager.PlayAudio(1,AudioName.PlyerKill);
            //音效
            //互毁
            Destroy(gameObject);
            Destroy(other.gameObject);
            //over
            _createGameManager.StopGame();
            _audioManager.StopGame();
            _scoreManager.StopGame();
        }//EndPlayer

        if (other.tag.Equals(TagManager.PlayBulletName))  //如果与敌机子弹碰撞的是玩家子弹
        {
            if (IsDes)  //敌机子弹可以被抵消
            {
                Destroy(other.gameObject);
                Destroy(gameObject);
            }
            else   //敌机子弹不可被抵消
            {
                Destroy(other.gameObject);
            }
        }//EndPlayBullet
       
    }

   
}

猜你喜欢

转载自blog.csdn.net/qq_43140883/article/details/82986981
今日推荐