Unity 繞不過的飛機大戰(zhàn)


這是今天的成果吧,雖然還是沒有全部完成,但是大致的功能已經(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)容,如果我沒有補上去,請見諒。。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容