飞机大战脚本整理

陨石脚本

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()
    {
        _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()
    {
        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);
            }
        }//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();
        }//PlayerEnd


    }


}

  • 声音管理者
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManagerCtr : MonoBehaviour
{

    public AudioClip[] Clips;

    //1. BG 
    //2. Plyer 子弹发射 玩家销毁
    //3. EnemyShip                     子弹发射敌机销毁
    //4. Enemy                                                         //陨石销毁 
    private AudioSource[] _sources;

    void Start()
    {
        _sources = gameObject.GetComponents<AudioSource>();

    }

    // Update is called once per frame
    void Update()
    {

    }

    public void StopGame()
    {
        _sources[0].Stop();
    }
    public void PlayAudio(int AudioIndex, string ClipName)
    {
        AudioClip tmpClip = null;
        foreach (AudioClip clip in Clips)
        {
            if (clip.name.Equals(ClipName))
            {
                tmpClip = clip;
                break;
            }
        }
        if (tmpClip == null)  //片段名字错误
            return;
        _sources[AudioIndex].clip = tmpClip;
        _sources[AudioIndex].Play();

    }
    public void PlayAudio(int AudioIndex)
    {

    }
}

声音名字管理

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

public class AudioName
{
    //定义name
    public static string PlyerKill = "explosion_player";
    public static string PlyerShoot = "weapon_player";
    public static string EnemyShipKill = "explosion_enemy";
    public static string EnemyShipShoot = "weapon_enemy";
    public static string EnemyKill = "explosion_asteroid";
   
}

特效球

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

public class BollCtr : MonoBehaviour
{

    // Use this for initialization


    private MeshRenderer _meshRenderer;
    private bool _isHAHA;
    private float _timer;
    private CreateGameManagerCtr _createGameManager;
    private AudioManagerCtr _audioManager;
    private ScoreManager _scoreManager;

    void Start()
    {
        _isHAHA = true;
        _meshRenderer = gameObject.GetComponent<MeshRenderer>();
        _scoreManager = GameObject.FindWithTag(TagManager.ScoreManagerName).GetComponent<ScoreManager>();
        _audioManager = GameObject.FindWithTag(TagManager.AudioManagerName).GetComponent<AudioManagerCtr>();
        _createGameManager = GameObject.FindWithTag(TagManager.CreateManagerName).GetComponent<CreateGameManagerCtr>();

    }

    // Update is called once per frame
    void Update()
    {
        _timer += Time.deltaTime;
        if (_timer >= 1.5f && _isHAHA)
        {
            _isHAHA = false;
            StartCoroutine("HAHA");
        }

    }


    IEnumerator HAHA()
    {
        while (true)
        {
            yield return new WaitForSeconds(0.2f);
            _meshRenderer.enabled = false;
            yield return new WaitForSeconds(0.2f);
            _meshRenderer.enabled = true;

        }
    }

    private void OnTriggerEnter(Collider other)

    {
        if (other.tag.Equals("Player"))
        {
            switch (gameObject.tag)
            {
                case "BlueBoll":
                    //zidan
                    GameObject tmp = Resources.Load("Bullets") as GameObject;
                    other.gameObject.GetComponent<PlayerShipCtr>().PlayerBullet = tmp;

                    break;
                case "GreenBoll":
                    _createGameManager.CellPlayerIsProtected = true;
                    break;
                case "RedBoll":
                    _scoreManager.AddScore(100);
                    break;
            }
            Destroy(gameObject);
        }


    }


}

创建管理者


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

public class CreateGameManagerCtr : MonoBehaviour
{

    //x -->  -3.5  -2  -0.5  1  2.5  3.5
    // 0
    // 16 
    //0 敌机
    // 1~3 陨石
    //波次 协同
    //波次 数量
    public GameObject[] EnemyObjects;
    //爆炸特效 
    public GameObject[] ParitcleObjects;

    public GameObject[] Bolls;
    public bool PlayerOver;
    public bool CellPlayerIsProtected;
    public bool PlayerIsProtected;
    //存储初始化点的位置
    private Vector3[] CreatePos;

    private float _timer;
    void Start()
    {
        //
        CellPlayerIsProtected = true;
        PlayerIsProtected = true;
        PlayerOver = false;
        CreatePos = new Vector3[8];
        for (int i = 0; i < 7; i++)
        {
            //
            CreatePos[i].Set(-6.5f + i * 1.8f, 0, 16);
        }
        CreatePos[CreatePos.Length - 1].Set(6.5f, 0, 16);

        StartCoroutine("IEnumCreateEnemy");
    }

    // Update is called once per frame
    void Update()
    {
        _timer += Time.deltaTime;
        if (CellPlayerIsProtected)
        {
            PlayerIsProtected = true;
            CellPlayerIsProtected = false;
            _timer = 0;
        }
        if (_timer >= 5.0f)
        {
            PlayerIsProtected = false;
        }
    }

    IEnumerator IEnumCreateEnemy()
    {
        int EnemyShipCount = 0;
        while (true)
        {
            EnemyShipCount = 0;
            int tmpNumber = Random.Range(8, 15);
            for (int i = 0; i < tmpNumber; i++)
            {
                EnemyShipCount++;
                CreateEnemy(EnemyShipCount);
                yield return new WaitForSeconds(0.4f);
            }
            yield return new WaitForSeconds(1.5f);
        }
    }


    public void CreateEnemy(int shipCount)
    {
        GameObject tmpGameObject;
        if (shipCount % 3 == 0)
        {
            //敌机
            tmpGameObject = Instantiate(EnemyObjects[0], CreatePos[Random.Range(0, CreatePos.Length)], Quaternion.identity);
            tmpGameObject.GetComponent<EnemyShipCtr>().Score = Random.Range(10, 20);
            tmpGameObject.GetComponent<EnemyShipCtr>().Left = Random.Range(0, 3);

        }
        else
        {
            //陨石
            tmpGameObject = Instantiate(EnemyObjects[Random.Range(1, EnemyObjects.Length)], CreatePos[Random.Range(0, CreatePos.Length)], Quaternion.identity);
            tmpGameObject.GetComponent<AsteroidCtr>().Score = Random.Range(5, 10);

        }
        if (shipCount % 4 == 0)
        {
            if (tmpGameObject.tag.Equals(TagManager.EnemyShip))
            {
                tmpGameObject.GetComponent<EnemyShipCtr>().Boll = Bolls[Random.Range(0, Bolls.Length)];
            }
            else
            {
                tmpGameObject.GetComponent<AsteroidCtr>().Boll = Bolls[Random.Range(0, Bolls.Length)];

            }
        }


    }

    public void CreateParticleByV3AndIndex(Vector3 CreatePoint, int index)
    {
        GameObject tmpGameObject = Instantiate(ParitcleObjects[index], CreatePoint, Quaternion.identity);
        Destroy(tmpGameObject, 2f);
    }

    public void StopGame()
    {
        PlayerOver = true;
        StopCoroutine("IEnumCreateEnemy");

    }
}

特殊子弹

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

public class DesBullets : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            transform.Find(i.ToString()).gameObject.GetComponent<PlayerBulletCtr>().MoveSpeed = 10;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.childCount == 0)
            Destroy(gameObject);

    }
}

敌机子弹脚本

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

public class EnemyBulletCtr : MonoBehaviour
{

    // Use this for initialization
    public int MoveSpeed;
    public bool IsDes;

    private CreateGameManagerCtr _createGameManager;
    private AudioManagerCtr _audioManager;
    private ScoreManager _scoreManager;
    private Rigidbody _rig;
    void Start()
    {
        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

    }


}

敌机脚本

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;


    // Use this for initialization
    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);
        _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);
            }
        }//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 KillAll : MonoBehaviour {



     void OnTriggerEnter(Collider other)
    {
        //销毁所有普碰撞的物体
        Destroy(other.gameObject);
    }
}

玩家子弹脚本

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

public class PlayerBulletCtr : MonoBehaviour {

	// Use this for initialization
    public float MoveSpeed;

    private Rigidbody _rig;
	void Start ()
	{
        //transform.rotation = Quaternion.Euler(90,0,0);//初始化旋转角度
	    _rig = GetComponent<Rigidbody>();//获得刚体
	    if (null == _rig)//没有刚体就添加刚体
	    {
	        _rig = gameObject.AddComponent<Rigidbody>();
	    }
	    _rig.useGravity = false;//去掉重力
        if(MoveSpeed == 0)//初始化速度
	    MoveSpeed = 5;
        //单位速度      方向*速度
	    _rig.velocity = transform.up * MoveSpeed;
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

玩家飞船

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

public class PlayerShipCtr : MonoBehaviour
{

    public float MoveSpeed;//速度
    public float FireTime;//开火时间
    public GameObject PlayerBullet;//子弹
        

    //私有变量统一使用_下划线
    private Rigidbody _rig;//刚体
    private AudioManagerCtr _audioManager;//音效
    private float _timer; // 计时器

    void Start()//初始化变量
    {
        FireTime = 0.1f;
        _rig = GetComponent<Rigidbody>();
        if (null == _rig)
        {
            _rig = gameObject.AddComponent<Rigidbody>();
        }
        _rig.useGravity = false;
        if (MoveSpeed == 0)
        {
            MoveSpeed = 14;
        }
        _audioManager = GameObject.FindWithTag("AudioManager").GetComponent<AudioManagerCtr>();
        _timer = 0;

    }

    //逻辑
    void Update()
    {
        _timer += Time.deltaTime;
        if (Input.GetMouseButton(0) && _timer >= FireTime)
        {
            //实例化子弹
            _timer = 0;
            /*                     //实例化(物体,位置,是否旋转)
           GameObject obj = Instantiate(PlayerBullet, gameObject.transform.Find("BulletPos").position, Quaternion.identity);
           obj.GetComponent<PlayerBulletCtr>().MoveSpeed = 7;//子弹速度
           _audioManager.PlayAudio(1, AudioName.PlyerShoot);//传入实参(下标,名字)*/
            GameObject obj = Instantiate(PlayerBullet);
            obj.transform.position = gameObject.transform.Find("BulletPos").position;
            if (obj.tag.Equals(TagManager.PlayBulletName)) // 1发
                obj.GetComponent<PlayerBulletCtr>().MoveSpeed = 7;

            _audioManager.PlayAudio(1, AudioName.PlyerShoot);
        }
    }

    //物理
    void FixedUpdate()//处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)
    {//得到水平轴垂直轴,Edit,project setting,Input
        //          得到用户水平和竖直方向上的输入         由0 ~ +-1 变化的 
        float _v = Input.GetAxisRaw("Vertical");          //得到垂直轴向的输入
        float _h = Input.GetAxisRaw("Horizontal");          //得到水平轴向的输入
        //  Input.GetAxisRaw()            没有渐变 直接就是 0 -1 1 
        //  Debug.LogFormat("水平输入是{0}\t\t 垂直输入是{1}",_h,_v);
        //向量的归一化 一般用在控制移动  获取方向
        Vector3 v3 = new Vector3(_h, 0, _v).normalized;
        _rig.velocity = v3 * MoveSpeed;//单位速度,方向*大小

        //_rig.transform.position = new Vector3(-6.5~6.5,0,-3.5~13.5);
        //固定玩家位置
        _rig.transform.position = new Vector3(
            //数学(限制谁,在最小最大范围内)
            Mathf.Clamp(_rig.transform.position.x,-6.5f,6.5f),
            0,
            Mathf.Clamp(_rig.transform.position.z, -3.5f, 13.5f));

        //四元数,                                     (角度*轴向,围绕哪个轴)
        _rig.transform.rotation = Quaternion.AngleAxis(30*-_h,transform.forward);
    }

}

分数管理者

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


public class ScoreManager : MonoBehaviour
{

    public Text ScoreText;
    public GameObject OverGameObject;
    private int _tmpScore;


    void Awake()
    {
        _tmpScore = 0;
    }

    public void AddScore(int Score)
    {

        _tmpScore += Score;
        ScoreText.text = string.Format("score: {0}", _tmpScore);

    }

    public void StopGame()
    {

        //OverGameObject.transform.DOScale(Vector3.one, 1);
        OverGameObject.SetActive(true);

        OverGameObject.transform.Find("OverScore")
            .gameObject.GetComponent<Text>().text
            = string.Format("score: {0}", _tmpScore);
    }
    public void ReStart()
    {
        OverGameObject.SetActive(false);
        _tmpScore = 0;
        AddScore(_tmpScore);
    }
}

标签管理者

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//标签管理者
public class TagManager
{
    public static string PlayName = "Player";
    public static string PlayBulletName = "PlayerBullet";
    public static string AudioManagerName = "AudioManager";
    public static string EnemyName = "Enemy";
    public static string EnemyShip = "EnemyShip";
    public static string CreateManagerName = "CreateGameManager";
    public static string ScoreManagerName = "ScoreManager";


}

猜你喜欢

转载自blog.csdn.net/luxifa1/article/details/82987590
今日推荐