Unity 绕不过的飞机大战

Unity 绕不过的飞机大战_第1张图片


Unity 绕不过的飞机大战_第2张图片

这是今天的成果吧,虽然还是没有全部完成,但是大致的功能已经实现,飞机的移动,限制移动范围,子弹的发射,消灭敌人,敌人的随机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();//挂载脚本

}

}

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().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();                

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

_tempEnemy.GetComponent().isShip = true;               

_tempEnemy.GetComponent().Left = 4;               

 break;            

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

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

_tempEnemy.AddComponent();             

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

_tempEnemy.GetComponent().isShip = true;               

_tempEnemy.GetComponent().Left = 4;               

break;            

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

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

_tempEnemy.AddComponent();               

break;            

case 4:                

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

_tempEnemy.AddComponent();               

break;           

 case 5:                

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

_tempEnemy.AddComponent();

break;

default:


break;

}

}



void Update () {

_timer += Time.deltaTime;

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

{

_timer = 0;

CreateEnemy();

}

}

}


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

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

你可能感兴趣的:(Unity 绕不过的飞机大战)