這是今天的成果吧,雖然還是沒有全部完成,但是大致的功能已經(jīng)實現(xiàn),飛機的移動,限制移動范圍,子彈的發(fā)射,消滅敵人,敵人的隨機X軸出現(xiàn),及飛船敵人會發(fā)射導彈。還有一點就是子彈會亂飛,我大概的猜測是發(fā)射速度太快了,子彈上有剛體的,導致擠開了其他的子彈,出現(xiàn)了子彈亂飛的情況。
以下是代碼部分,一共寫了五個類。
這個是子彈類,在這個類中,還需要寫敵人發(fā)射的子彈打中玩家,我還沒有寫
public class Buttle : MonoBehaviour
{? ??
public bool isPlayer = true; ? ?//該值是用來判斷是否是玩家射出的子彈
float _speed = 10f; ? ?//子彈速度
void Start() ??
{? ? ? ??
Destroy(gameObject, 3f); ? ?//創(chuàng)建子彈后,三秒后消除
}? ??
void Update()? ??
{? ? ? ??
if (isPlayer) ? ? ? //如果是玩家發(fā)射的子彈
?{? ? ? ? ? ??
transform.Translate(Vector3.up * _speed * Time.deltaTime);//按照Y軸正方向發(fā)射
}? ? ? ??
else? ? ? ??
{? ? ? ? ? ??
transform.Translate(Vector3.down * _speed * Time.deltaTime); //如果不是玩家發(fā)射的子彈則使其向Y軸的負方向發(fā)射 ? ? ??
}? ??
}? ??
void OnCollisionEnter(Collision other) ? //碰撞檢測
{? ? ? ??
if (other.gameObject.tag == "Enemy" && isPlayer) ? ? ? ?//如果是玩家發(fā)射的子彈并且打中了敵人
{? ? ? ? ? ??
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);//數(shù)學函數(shù),一直循環(huán)獲得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; ? ?//子彈發(fā)射的初始位置
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; //創(chuàng)建子彈實體 ? ? ? ? ??
_tempFire.SetActive(true);? ? ? ? ? ? //將子彈激活,一開始子彈是存在在場景中的只不過我不激活它
_tempFire.AddComponent<Bullet>();//掛載腳本
}
}
float _topMax = 13f;//這是限制飛機移動的參數(shù)
float _bottomMax = -1.5f;//這是限制飛機移動的參數(shù)
float _sideMax = 4.5f;//這是限制飛機移動的參數(shù)
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));//彈起時返回原來的狀態(tài)
}
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 () //分別調用函數(shù)?
{
Move();
TurnBody();
Limit();
Fire();
}
}
這是敵人的類
public class EnemyShip : MonoBehaviour?
{? ??
float _speed = 5f; ? ?//敵人的速度
float _timer = -2; ? ?//之所以將這個設置為-2,是因為讓它第一次發(fā)射子彈的時間推后
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() ? ?//創(chuàng)建子彈
{? ? ? ??
if (isShip) ? ? ? ?//如果這個類掛載到的是飛船類型的敵人就會創(chuàng)建子彈
{? ? ? ? ? ??
_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)//由于在創(chuàng)建飛船的時候需要將其旋轉所以它的坐標系也變了.它的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) //飛船會自動發(fā)射子彈
{
_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; ? ?//敵人開始創(chuàng)建的Y軸坐標
void CreateEnemy()? ??
{? ? ? ??
int randType = Random.Range(1, 6); ? ? ? ?//隨機創(chuàng)建敵人的種類
float randPosX = Random.Range(-4f, 4f); ? ? ? ?//隨機敵人的X軸坐標
switch (randType)? ? ? ??
{? ? ? ? ? ??
case 1: ? ? ?//當創(chuàng)建的是第一種敵人也就是飛船時,將其旋轉,并且將它身上掛上腳本,并獲得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:? ? ? ? ? ? ? ? //當創(chuàng)建的是第二種敵人也就是飛船時,將其旋轉,并且將它身上掛上腳本,并獲得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: ? ? ? ? ? ? ? ?//當創(chuàng)建的是普通的敵人時只要掛載腳本就可以了
_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時創(chuàng)建一個敵人
{
_timer = 0;
CreateEnemy();
}
}
}
以上就是大致完成的飛機大戰(zhàn).待完善的地方還有很多.要學習的地方還有很多,如有錯誤,萬望指教。
PS:簡書在復制代碼的時候好像會吞掉尖括號和尖括號里的內(nèi)容,如果我沒有補上去,請見諒。。