Unity3d實現(xiàn)Flappy Bird游戲
本文實例為大家分享了Unity3d實現(xiàn)Flappy Bird的具體代碼,供大家參考,具體內容如下
一、小鳥
在游戲中,小鳥并不做水平位移,而是通過障礙物的移動讓小鳥有水平運動的感覺,小鳥只需要對鼠標的點擊調整豎直加速度就可以了,同時加上水平旋轉模仿原版的FlappyBird的運動。同時,還要對豎直位置進行判斷,否則游戲不能正常結束。
這里貼上小鳥上附加的腳本代碼
Player.cs
using UnityEngine;
using System.Collections;
 
public class Player : MonoBehaviour {
 
 
 private Rigidbody body;
 public Vector3 jumpForce = new Vector3(0, 300, 0);
 private bool state = true; //確保只執(zhí)行一次
 private int bestScore = 0;
 
 // Use this for initialization
 void Start () {
  
  body = transform.GetComponent<Rigidbody>();  
 }
 
 void OnCollisionEnter(Collision collisionInfo)
 {
  if (state)
  {
   //碰撞游戲結束
   state = false;
   Score.instance.state = false;
   AudioManager.instance.PlayHit();
   AudioManager.instance.PlayDie();
   Invoke("EndGame", 0.4f);
  }
  
  
 }
 
 // Update is called once per frame
 void Update () 
 {
  //下限
  if (transform.position.y < -20)
  {
   if (state)
   {
    state = false;
    Score.instance.state = false;
    AudioManager.instance.PlayDie();
    Invoke("EndGame", 0.4f);
   }
  }
 
  //上限
  if (transform.position.y > 20)
  {
   if (state)
   {
    state = false;
    Score.instance.state = false;
    AudioManager.instance.PlayDie();
    Invoke("EndGame", 0.4f);
   }
  }
  //判斷鼠標左鍵點擊或者空格
  if (Input.GetKeyDown(KeyCode.Space)||Input.GetMouseButtonDown(0))
  {
   AudioManager.instance.PlayFly();
   body.velocity = Vector3.zero;
   //加速度
   body.AddForce(jumpForce);
   //控制旋轉量
   this.transform.rotation = Quaternion.Euler(45, 270, 0);
  }   
  else
  {
    //旋轉
   if (transform.rotation.eulerAngles.x >= 280||transform.rotation.eulerAngles.x<=50)
   {
    
    transform.Rotate(-150 * Time.deltaTime, 0, 0);
   }
  }
 
 }
 
 public void EndGame()
 {
  //保存最佳成績
  PlayerPrefs.SetInt("PlayerScore", Score.instance.score);
  bestScore = PlayerPrefs.GetInt("PlayerBestScore");
  if (Score.instance.score > bestScore)
   bestScore = Score.instance.score;
  PlayerPrefs.SetInt("PlayerBestScore", bestScore);
  //跳轉到結束場景
  Application.LoadLevel("End");
 }
 
}
二、障礙物
障礙物只要定時產(chǎn)生,隨機設定偏移量,然后添加向左運動的速度就行了,同時要設定自動銷毀的時間,回收障礙物,否則內存占用會越來越大。
這里用了三個腳本,分別是上下障礙物和障礙物生成腳本。附加到一個空物體上就行了。
GenerateObstacle.cs
using UnityEngine;
using System.Collections;
 
public class GenrateObstacle : MonoBehaviour {
 
 public GameObject obstacle;
 public GameObject obstacle1;
 public float startTime = 1f;
 public float gapTime=1.5f;
 public float gapDistance = 13;
 private Vector3 gapVector;
 private Vector3 midVector;
 // Use this for initialization
 void Start () {
  InvokeRepeating("InitiateObstacle", startTime, gapTime);
  gapVector = new Vector3(0, gapDistance / 2, 0);
  
 }
 
 void InitiateObstacle()
 {
  midVector = new Vector3(8,Random.Range(-3.2f, 3.2f),0);
 
  Instantiate(obstacle, midVector+gapVector,new Quaternion(0,0,180,0));
  Instantiate(obstacle1, midVector-gapVector, Quaternion.identity);
  
 }
}
Obstacle.cs
using UnityEngine;
using System.Collections;
 
public class Obstacle : MonoBehaviour {
 
 public float speed = -8f;
 private Rigidbody body;
 private Transform player;
 private bool isPassed = false;
 // Use this for initialization
 void Start () {
  Destroy(this.gameObject, 4);
  body = this.GetComponent<Rigidbody>();
  body.velocity = new Vector3(speed, 0, 0);
  player = GameObject.FindGameObjectWithTag("Bird").transform;
 }
 
 // Update is called once per frame
 void Update () {
  if (player.transform.position.x > transform.position.x && isPassed == false)
  {
   isPassed = true;
   
   Score.instance.GetScore();
  }
 }
}
Obstacle1.cs
using UnityEngine;
using System.Collections;
 
public class Obstacle1 : MonoBehaviour {
 public float speed = -8f;
 private Rigidbody body;
 private Transform player;
 private bool isPassed = false;
 // Use this for initialization
 void Start()
 {
  Destroy(this.gameObject, 4);
  body = this.GetComponent<Rigidbody>();
  body.velocity = new Vector3(speed, 0, 0);
  player = GameObject.FindGameObjectWithTag("Bird").transform;
 }
 
 
}
此外還有分數(shù)顯示,最佳分數(shù)顯示,音效等等,都是細節(jié)。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10C#實現(xiàn)txt定位指定行完整實例
 - 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
 - 01-10C#實現(xiàn)清空回收站的方法
 - 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
 - 01-10C#實現(xiàn)多線程下載文件的方法
 - 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
 - 01-10C#實現(xiàn)遠程關閉計算機或重啟計算機的方法
 - 01-10C#自定義簽名章實現(xiàn)方法
 - 01-10C#文件斷點續(xù)傳實現(xiàn)方法
 - 01-10winform實現(xiàn)創(chuàng)建最前端窗體的方法
 


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
 - 01-10關于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實現(xiàn)txt定位指定行完整實例
 - 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
 - 01-10C#停止線程的方法
 - 01-10C#實現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
 
隨機閱讀
- 01-10C#中split用法實例總結
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 04-02jquery與jsp,用jquery
 - 01-10delphi制作wav文件的方法
 


