Unity 绕不过的飞机大战


这是今天的成果吧,虽然还是没有全部完成,但是大致的功能已经实现,飞机的移动,限制移动范围,子弹的发射,消灭敌人,敌人的随机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:简书在复制代码的时候好像会吞掉尖括号和尖括号里的内容,如果我没有补上去,请见谅。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容