【Unity】FlappyBird剖析-附源碼

來源:互聯網
上載者:User

FlappyBird不用多說了,一款極其簡單,但是又很火的遊戲。我在得知這款瘋狂的遊戲後,就有一種把它重現的衝動,然後花了我4個多小時,產生出了一個可以玩的版本,分享給大家(文末尾付下載連結)。

下面簡單介紹遊戲的開發過程(本文的例子需要使用unity4.3.0以上的版本開啟)。

目錄介紹 運行圖:
項目的目錄結構如,anims中存放動畫資源,prefab中存放預置對象,scprits存放指令碼,sprites用來存放貼圖。
準備資源擷取FlappyBird的貼圖資源和音效資源。把資源匯入到sprites檔案夾下,選中atlas,在Inspector中進行編輯,如:
設定為sprite,模式為Multiple,點擊按鈕Sprite Editor進行相應的圖片分隔。在彈出的對話方塊中,可以使用自動切圖方式,如:
接下來就可以進行編碼了設定情境為了區分情境的層次(主要是用來決定圖層的順序,sorting Layer的功能)以及編碼的需求,建立一些tag sorting Layer和Layer。先點擊Unity編輯器右上方的Layers下拉式功能表並選擇"Edit Layers...",如:並填寫如下資訊:
移動的道路和障礙一格道路有兩個障礙(如),情境中用兩格道路來反覆迴圈(當一格道路移出螢幕後就重新調整位置,等待下一次出現在螢幕上),達到不斷移動的效果。
下面是道路移動的部分代碼road.cs
public class road : MonoBehaviour {....// Update is called once per framevoid Update () { Vector3 pos = trans.position;pos.x -= speed * Time.deltaTime;trans.position = pos;if(pos.x <= -1.6f - 3.35f*idx) {   //當道路移出螢幕後,從小調整其位置Vector3 pp = roads[idx%2].transform.position;pp.x += 3.35f;idx++;roads[idx%2].transform.position = pp;if(isBegin){roads[idx%2].GetComponent<roadGen>().gen();}}}

道路障礙的顯示與否(在歡迎頁面,路面不需要障礙),以及障礙的產生都在檔案roadGen.cs中,我把上下柱子合并成一個對象,在產生障礙時,只要使其在一定範圍內上下移動就可以了。程式碼片段如下:
public class roadGen : MonoBehaviour {      public GameObject[] zhuzi;      public float down=3.8f, upper = 6.0f;     ...      public void gen() { // 一格道路有兩個柱子          zhuzi[0].SetActive(true);          zhuzi[1].SetActive(true);          Vector3 p = zhuzi[0].transform.localPosition;            float vv = Random.value;          p.y = Mathf.Lerp(down, upper, vv);           zhuzi[0].transform.localPosition = p; //設定第一個柱子的位置            p = zhuzi[1].transform.localPosition;           vv = Random.value;          p.y = Mathf.Lerp(down, upper, vv);          zhuzi[1].transform.localPosition = p; //設定第二個柱子的位置    }        public void hidden() {          zhuzi[0].SetActive(false);          zhuzi[1].SetActive(false);      }  }  
最後在障礙物和地面都添加BoxCollider2D,使其能夠擷取碰撞訊息。
大嘴唇的小鳥首先小鳥有個飛行的幀動畫,在sprite檔案夾下的atlas中,選擇三個幀,直接拖動到情境中,unity自動形成了一個帶有幀動畫的sprite。選中該sprite,在Window/Animation介面中,調整sprite的播放時間,如:
同樣要給小鳥一個BoxCollider2D的Component,使其能夠響應碰撞,還要添加Rigibody2D。具體請參考例子。這裡會涉及到兩個指令碼(時間匆忙,沒怎麼考慮設計):bird.cs和clider.cs;前者用來向小鳥施加力的作用,後者處理碰撞。這個遊戲的最主要部分就是 clider .cs,這個檔案處理得分和是否碰撞到障礙物。代碼如下:
using UnityEngine;using System.Collections;public class clider : MonoBehaviour {public score s;public int clideNum;public string tag;public bool isSuccess = false, isFail = false;// Use this for initializationvoid Start () {s = GameObject.Find("score").GetComponent<score>();clideNum = 0;tag = "";isSuccess = false;isFail = false;}// Update is called once per framevoid Update () {}void OnTriggerEnter2D(Collider2D other) {if(other.gameObject.tag.Equals("success")) {if(!isSuccess) {print("===trigger enter==");isSuccess = true;s.success();print ("success");}} else if(!isFail) {print("===trigger enter==");isFail = true;s.fail();print ("fail");}}void OnTriggerExit2D(Collider2D other) {print("===trigger exit==");isSuccess = false;}void OnCollisionEnter2D(Collision2D other) { if(other.gameObject.tag.Equals("success")) {if(!isSuccess) {print("===collision enter==");isSuccess = true;s.success();}} else if(!isFail) {print("===collision enter==");isFail = true;s.fail();}}void OnCollisionExit2D(Collision2D coll) {print("===collision exit==");isSuccess = false;}public void reset() {isSuccess = false;isFail = false;}}
歡迎頁面歡迎頁面有個小鳥的動畫,並且能夠響應觸摸後開始遊戲(在isReady.cs中實現)。小鳥的動畫就是上下擺動的過程,選擇小鳥,然後在Animation介面中,添加Position屬性,並調節如:
isReady.cs的代碼如下:
public class isReady : MonoBehaviour {      public GameObject road, bird;      // Use this for initialization      void Start () {            }            // Update is called once per frame      void Update () {          if(Input.GetButtonDown("Fire1")){ //使用者觸控螢幕幕之後,就開始遊戲了              gameObject.SetActive(false);              road.GetComponent<road>().isBegin = true;              bird.GetComponent<Rigidbody2D>().isKinematic = false;//歡迎頁面,這裡設定為true,使小鳥不響應重力,開始後要設定為false             bird.GetComponent<Animator>().enabled = false;          }      }  }  


結算頁面結算頁面開始使隱藏的,等使用者輸了之後,就會播放一個動畫並顯示,當使用者點擊play按鈕後,遊戲重設到歡迎頁面。結算頁面涉及到了指令碼restart.cs這裡遊戲重設的時,用到了BroadcastMessage的技術,即尋找所有tag為needReset的對象,並調用其自身以及子物件中的代碼中的reset函數來進行遊戲的重設。代碼如下:
public class restart : MonoBehaviour {      public Camera cam2d;      public GameObject ready;             void Update () {          if(Input.GetButtonDown("Fire1")){               Collider2D h = Physics2D.OverlapPoint(cam2d.ScreenToWorldPoint(Input.mousePosition), (1<<LayerMask.NameToLayer("btn")));                if(h) {  // 如果點擊play按鈕                  gameObject.SetActive(false);                  Time.timeScale = 1;                   ready.SetActive(true);                  GameObject[] resets = GameObject.FindGameObjectsWithTag("needReset"); //尋找所有tag為needReset的對象                 foreach(GameObject r in resets) {                      r.BroadcastMessage("reset"); //調用其自身以及子物件中的代碼中的reset函數來進行遊戲的重設                }              }            }      }  


關於Physics2D.OverlapPoint的用法,請參考《【Unity】技巧集合》中的第二點。
添加音效待續...

聲明:這篇文章中所引用的資源部分來自網路,僅供學習之用,請勿商業化。

:http://download.csdn.net/detail/stalendp/6914227

apk下載連結:http://pan.baidu.com/s/1c09rKMc

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.