美文网首页
Unity 绕不过的飞机大战

Unity 绕不过的飞机大战

作者: Unity学习的路上 | 来源:发表于2017-01-12 22:42 被阅读0次

    这是今天的成果吧,虽然还是没有全部完成,但是大致的功能已经实现,飞机的移动,限制移动范围,子弹的发射,消灭敌人,敌人的随机X轴出现,及飞船敌人会发射导弹。还有一点就是子弹会乱飞,我大概的猜测是发射速度太快了,子弹上有刚体的,导致挤开了其他的子弹,出现了子弹乱飞的情况。

    以下是代码部分,一共写了五个类。

    这个是子弹类,在这个类中,还需要写敌人发射的子弹打中玩家,我还没有写

    public class Buttle : MonoBehaviour

    {    

    public bool isPlayer = true;    //该值是用来判断是否是玩家射出的子弹

    float _speed = 10f;    //子弹速度

    void Start()   

    {        

    Destroy(gameObject, 3f);    //创建子弹后,三秒后消除

    }    

    void Update()    

    {        

    if (isPlayer)       //如果是玩家发射的子弹

     {            

    transform.Translate(Vector3.up * _speed * Time.deltaTime);//按照Y轴正方向发射

    }        

    else        

    {            

    transform.Translate(Vector3.down * _speed * Time.deltaTime); //如果不是玩家发射的子弹则使其向Y轴的负方向发射       

    }    

    }    

    void OnCollisionEnter(Collision other)   //碰撞检测

    {        

    if (other.gameObject.tag == "Enemy" && isPlayer)        //如果是玩家发射的子弹并且打中了敌人

    {            

    other.gameObject.GetComponent().Hurt(1);//获得敌人身上挂载的脚本中的Hurt方法

    Destroy(gameObject);//消灭子弹自身

    }

    }

    }

    这个类是挂在背景上的,使背景一直往下移动,看起来像是飞机自己在向前飞

    public class BackGroundController : MonoBehaviour {

    float _moveSpeed = 0.25f;//往下移动的速度

    float _camera = -20.4f;//这是两个背景叠在一起之后连接的地方,因为两个背景是无缝连接的

    Vector3 startPos;

    void Start () {

    startPos = transform.position;//记录开始的位置

    }

    void Update () {

    float _tempValue = Mathf.Repeat(Time.time * _moveSpeed, _camera);//数学函数,一直循环获得0-(-20.4)的值

    transform.position = new Vector3(startPos.x, _tempValue, startPos.z);//设置当前位置

    }

    }

    这是飞机的类

    public class Plane : MonoBehaviour 

    {    

    float _hor_Speed = 0.15f;    //水平速度

    float _ver_Speed = 0.15f;  //垂直速度

     GameObject buttle;    //子弹

    GameObject firePos;    //子弹发射的初始位置

    void Awake()    

    {        

    buttle = transform.Find("Bullet").gameObject;        

    firePos = transform.Find("FirePos").gameObject;   

     }    

    GameObject _tempFire;    //临时的子弹

    void Fire()    

    {        

    if (Input.GetKey(KeyCode.J))        

    {            

    _tempFire = Instantiate(buttle, firePos.transform.position, Quaternion.identity) as GameObject; //创建子弹实体           

    _tempFire.SetActive(true);            //将子弹激活,一开始子弹是存在在场景中的只不过我不激活它

    _tempFire.AddComponent<Bullet>();//挂载脚本

    }

    }

    float _topMax = 13f;//这是限制飞机移动的参数

    float _bottomMax = -1.5f;//这是限制飞机移动的参数

    float _sideMax = 4.5f;//这是限制飞机移动的参数

    void Limit()

    {

    if (transform.position.x > _sideMax)

    {

    transform.position = new Vector2(-_sideMax, transform.position.y);//当飞机向左移动至临界点,就将它的坐标设置为右边的临界点

    }

    if (transform.position.x <  -_sideMax)

    {

    transform.position = new Vector2(_sideMax, transform.position.y);//当飞机向右移动至临界点,就将它的坐标设置为左边的临界点

    }

    if (transform.position.y > _topMax)

    {

    transform.position = new Vector2(transform.position.x, _topMax);//当飞机移动至上方临界点时将它的坐标设置为临界点的坐标

    }

    if (transform.position.y < _bottomMax)

    {

    transform.position = new Vector2(transform.position.x, _bottomMax);//当飞机移动至下方临界点时将它的坐标设置为临界点的坐标

    }

    }

    float _turnAngle = 45;//转动角度

    void TurnBody()

    {

    if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))

    {

    transform.Rotate(new Vector3(0, _turnAngle, 0));//当按下A键或者方向键的left键时飞机会有一个沿Y轴有一个转动

    }

    if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow))

    {

    transform.Rotate(new Vector3(0, -_turnAngle, 0));

    }

    if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.LeftArrow))

    {

    transform.Rotate(new Vector3(0, -_turnAngle, 0));//弹起时返回原来的状态

    }

    if (Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp(KeyCode.RightArrow))

    {

    transform.Rotate(new Vector3(0, _turnAngle, 0));

    }

    }

    void Move()//飞机自身的移动

    {

    float ver = Input.GetAxis("Vertical");

    float hor = Input.GetAxis("Horizontal");

    transform.position +=new Vector3(hor * _hor_Speed, ver * _ver_Speed, 0);

    }

    void Update () //分别调用函数 

    {

    Move();

    TurnBody();

    Limit();

    Fire();

    }

    }

    这是敌人的类

    public class EnemyShip : MonoBehaviour 

    {    

    float _speed = 5f;    //敌人的速度

    float _timer = -2;    //之所以将这个设置为-2,是因为让它第一次发射子弹的时间推后

    public bool isShip = false;    //判断是飞船还是子弹

    public int Left = 2;    //当前生命

    Transform firePos;    //飞船开火的位置

    GameObject _buttle;    //子弹

    void Awake()    

    {        

    _buttle = Resources.Load("Prefab/Bullet") as GameObject;        

    firePos = transform.Find("fire");    

    }    

    GameObject _tempBullet;    

    void CreateFire()    //创建子弹

    {        

    if (isShip)        //如果这个类挂载到的是飞船类型的敌人就会创建子弹

    {            

    _tempBullet = Instantiate(_buttle, firePos.position,Quaternion.identity) as GameObject;            

    _tempBullet.AddComponent();            

    _tempBullet.SetActive(true);            

    _tempBullet.GetComponent<Bullet>().isPlayer = false; //获取子弹上的IsPlayer,将其设置为false

    }

    }

    public void Hurt(int value)//敌人收到伤害

    {

    Left -= value;

    if (Left <= 0)

    {

    Destroy(gameObject);//当生命值为0时销毁

    }

    }

    void Update () {

    _timer += Time.deltaTime;

    if (!isShip)//由于在创建飞船的时候需要将其旋转所以它的坐标系也变了.它的Z轴正方向与世界坐标系的Y轴负方向一致

    {

    transform.Translate(Vector3.down * _speed * Time.deltaTime);

    }

    else

    {

    transform.Translate(Vector3.forward * _speed * Time.deltaTime);//不是飞船的敌人只要向下落就可以了

    }

    if (transform.position.y < -30f)//当物体的Y轴超过-30就销毁自身

    {

    Destroy(gameObject);

    }

    if (_timer > 1 && isShip) //飞船会自动发射子弹

    {

    _timer = 0;

    CreateFire();

    }

    }

    }

    //这是敌人的管理类

    public class EnemyMgr : MonoBehaviour 

    {    

    GameObject _enemy_1;    

    GameObject _enemy_2;    

    GameObject _enemy_3;    

    GameObject _enemy_4;    

    GameObject _enemy_5;    

    float _timer = 0;    

    void Awake()    //初始化

    {       

     _enemy_1 = Resources.Load("Prefab/EnemyShip_a") as GameObject;        

    _enemy_2 = Resources.Load("Prefab/EnemyShip_b") as GameObject;       

     _enemy_3 = Resources.Load("Prefab/Rock_a_Prefab") as GameObject;        

    _enemy_4 = Resources.Load("Prefab/Rock_b_Prefab") as GameObject;        

    _enemy_5 = Resources.Load("Prefab/Rock_c_Prefab") as GameObject;    

    }    

    GameObject _tempEnemy;    

    float EnemyStartPosY = 3f;    //敌人开始创建的Y轴坐标

    void CreateEnemy()    

    {        

    int randType = Random.Range(1, 6);        //随机创建敌人的种类

    float randPosX = Random.Range(-4f, 4f);        //随机敌人的X轴坐标

    switch (randType)        

    {            

    case 1:      //当创建的是第一种敌人也就是飞船时,将其旋转,并且将它身上挂上脚本,并获得isShip,将其设置为true,生命改为4          

    _tempEnemy = Instantiate(_enemy_1,new Vector3(randPosX, EnemyStartPosY,0),Quaternion.identity) as GameObject;                

    _tempEnemy.AddComponent<EnemyShip>();                

    _tempEnemy.transform.Rotate(new Vector3(90, -180, 0));               

    _tempEnemy.GetComponent<EnemyShip>().isShip = true;               

    _tempEnemy.GetComponent<EnemyShip>().Left = 4;               

     break;            

    case 2:                //当创建的是第二种敌人也就是飞船时,将其旋转,并且将它身上挂上脚本,并获得isShip,将其设置为true,生命改为4

    _tempEnemy = Instantiate(_enemy_2, new Vector3(randPosX, EnemyStartPosY, 0), Quaternion.identity) as GameObject;                

    _tempEnemy.AddComponent<EnemyShip>();             

     _tempEnemy.transform.Rotate(new Vector3(90, -180, 0));               

    _tempEnemy.GetComponent<EnemyShip>().isShip = true;               

    _tempEnemy.GetComponent<EnemyShip>().Left = 4;               

    break;            

    case 3:                //当创建的是普通的敌人时只要挂载脚本就可以了

    _tempEnemy = Instantiate(_enemy_3, new Vector3(randPosX, EnemyStartPosY, 0), Quaternion.identity) as GameObject;                

    _tempEnemy.AddComponent<EnemyShip>();               

    break;            

    case 4:                

    _tempEnemy = Instantiate(_enemy_4, new Vector3(randPosX, EnemyStartPosY, 0), Quaternion.identity) as GameObject;                

    _tempEnemy.AddComponent<EnemyShip>();               

    break;           

     case 5:                

    _tempEnemy = Instantiate(_enemy_5, new Vector3(randPosX, EnemyStartPosY, 0), Quaternion.identity) as GameObject;                

    _tempEnemy.AddComponent<EnemyShip>();

    break;

    default:

    break;

    }

    }

    void Update () {

    _timer += Time.deltaTime;

    if (_timer > 1)//每当_timer大于1时创建一个敌人

    {

    _timer = 0;

    CreateEnemy();

    }

    }

    }

    以上就是大致完成的飞机大战.待完善的地方还有很多.要学习的地方还有很多,如有错误,万望指教。

    PS:简书在复制代码的时候好像会吞掉尖括号和尖括号里的内容,如果我没有补上去,请见谅。。

    相关文章

      网友评论

          本文标题:Unity 绕不过的飞机大战

          本文链接:https://www.haomeiwen.com/subject/iysjbttx.html