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