小項目《I Can Fly》

步驟一:創(chuàng)建游戲界面

首先將資源導入并且將圖片類型設置成2DandUI


Paste_Image.png

隨后我們將攝像機設置成正交模式


Paste_Image.png
然后我們創(chuàng)建Quad并且將背景材質(zhì)球和障礙物材質(zhì)都給其賦值
Paste_Image.png

Paste_Image.png

材質(zhì)的類型我們都設置成Transparent類型


Paste_Image.png
游戲?qū)ο筮菄}鴨的材質(zhì)由于有有序列幀動畫所以其材質(zhì)球的參數(shù)我們設置成如下
Paste_Image.png
首先先讓其只顯示第一幀的貼圖
Paste_Image.png

步驟二:制作咔噠鴨序列幀動畫并且讓咔噠鴨飛起來

搭建好背景后我們現(xiàn)在開始制作咔噠鴨的序列幀動畫了润梯,首先我們先在游戲?qū)ο筮菄}鴨上先掛載一個腳本并且命名為PlayerAnimator,然后我們開始寫我們的腳本。

public class PlayerAnimator : MonoBehaviour
{
    public float timer = 0;
    //顯示1秒15幀
    public int frameNumber=10;
    //當前是第0幀
    public int frameCount = 0;
    
    void Start () {
        //給一個恒定力來讓游戲?qū)ο笠恢蓖白?        GetComponent<Rigidbody>().velocity = new Vector3(2, 0, 0);
    }
    
    // Update is called once per frame
    void Update ()
    {
        Vector3 v3 = GetComponent<Rigidbody>().velocity;
        GetComponent<Rigidbody>().velocity = new Vector3(5, v3.y, v3.z);

        timer += Time.deltaTime;//計數(shù)器增長
        if (timer >= 1.0f / frameNumber)//當這個時間大于一幀的時間
        {
            frameCount++;//當前的幀率增加
            timer -= 1.0f / frameNumber;//這個時間減去一幀的時間

            int frameIndex = frameCount % 3;//計算當前需要顯示第幾幀畫面
            //更新小鳥的offset屬性
            //拿到Player上面的材質(zhì)球 對于材質(zhì)里面有貼圖的羊赵,只要使用_MainTex就能拿到主要的貼圖
            GetComponent<Renderer>().material.SetTextureOffset("_MainTex", new Vector2(0.33333f * frameIndex, 0));
        }
        if (Input.GetMouseButton(0))
        {
            Vector3 v2 = GetComponent<Rigidbody>().velocity;
            GetComponent<Rigidbody>().velocity = new Vector3(v2.x + 1, 5, v2.z);
            Debug.Log(GetComponent<Rigidbody>().velocity.y);
        }

    }
}

然后我們設置游戲?qū)ο筮菄}鴨的Tag值為‘Player’
然后我們在給我們的游戲?qū)ο筮菄}鴨添加剛體讓其擁有重力


Paste_Image.png

隨后我們運行查看下效果吧


Fly.gif

步驟三:讓我們的仙人掌隨機位置生成

首先我們先在仙人長的父空游戲?qū)ο笊蟿?chuàng)建腳本并且將其命名為cactusRamdom耐朴。


Paste_Image.png

下面我們打開腳本寫入腳本

public class cactusRamdom : MonoBehaviour {
    void Start () {
    RangerRandom();
    }
    public  void RangerRandom()
    {
        float Ranger = Random.Range(-0.302f,0.03f);//設置仙人掌隨機Y軸的值。
        this.transform.localPosition=new Vector3(this.transform.localPosition.x,Ranger,this.transform.localPosition.z);
    }    
}

運行后發(fā)現(xiàn)仙人掌的Y軸位置都隨機了


random.gif

步驟四:游戲界面的跳轉(zhuǎn)

首先我們得先添加一個空游戲?qū)ο蟛⑶医o其添加觸碰器并勾選其觸發(fā)器,然后我們設置碰撞器的size給其Z軸厚度女轿,并見其位置放在第二個界面的中間巧婶。


Paste_Image.png

然后我們添加其腳本并命名為scenceManager乾颁,然后我們打開腳本,寫入腳本如下

public class scenceManager : MonoBehaviour
{
    public Transform currentBg;
    public cactusRamdom pipe;
    public cactusRamdom pipe1;    
void OnTriggerEnter(Collider collider)
{
    if (collider.tag=="Player")
    { 
        //當期面板的位置=第一個面板的位置+自身的大小*3
        currentBg.position=new Vector3(currentBg.position.x+33,currentBg.position.y,currentBg.position.z);
        pipe.RangerRandom();//給其仙人掌1號隨機值
        pipe1.RangerRandom();//給其仙人掌2號隨機值
    }    
}
}

然后我們將該賦值的給其賦值最后別忘記Apply哦艺栈!


Paste_Image.png

最后我們運行后可以看到當我們走過觸發(fā)器后前一個界面就移至最后去了英岭,并且其仙人掌也是隨機的


Juming.gif

步驟五:設置攝像機跟隨游戲?qū)ο笠苿?/h4>

我們直接給攝像機上創(chuàng)建一腳本并且命名為:GameMover,我們?nèi)绾巫寯z像跟隨我們的游戲?qū)ο笞卟⑶襓軸不超出固定范圍呢湿右,下面我們來寫入腳本诅妹。


camera.gif
public class GameMover : MonoBehaviour
{
    public GameObject dog;
    private Transform dogTrangsform;

    private float indexY;
    //攝像機照射Y軸最高高度
    private float a=0.823f;
    //攝像機照射Y軸最低高度
    private float b=0.193f;
   void Start()
    {
        dog = GameObject.FindGameObjectWithTag("Player");
        dogTrangsform = dog.transform;      
    }
 void Update()
    {
       indexY = dogTrangsform.position.y;
         if (indexY==a||indexY>a)//如果需要的Y值等于或者大于最高值
        {
            indexY = a;//那么需要的值就等于最高的高度值
        }
        else if (indexY == b || indexY < b)//如果需要的Y值等于或者小于最低值
        {
            indexY = b;//那么需要的值就等于最低的高度值
        }else
        {
            indexY = dogTrangsform.position.y;//否則就將需要的值隨著攝像機的高度變換而變換
        }
        dogpos = dogTrangsform.position;
        this.transform.position = new Vector3(dogpos.x + 1.91f,indexY, -5f);
    }
}

運行測試下,效果還是不錯的哦


cameraJum.gif

步驟六:記錄積分

首先我們先在每個關(guān)卡上添加一個空游戲?qū)ο蟛⒔o其添加Box碰撞器并且勾選器觸發(fā)器,并且設置其位置和Z軸的厚度吭狡。

Paste_Image.png

隨后我們添加UGUI的Image和Text并將其位置和圖片設置好位置和大小


Paste_Image.png

然后我們在我們的每個關(guān)卡的觸發(fā)器上添加腳本并且命名為Integral
首先我們先在攝像機上的腳本GameMover上添加腳本設置其積分的值

public class GameMover : MonoBehaviour
{
    public int score = 0;//記錄積分
   public static GameMover Instances;
   void Awake()
    {
        Instances = this;
    }
}

隨后我們打開我們腳本Integral寫入腳本如下

using UnityEngine.UI;
public class Integral : MonoBehaviour
{    
    public Text integral;    
    void OnTriggerExit(Collider other)
    {    
      if (other.transform.tag=="Player")
      {
         GameMover.Instances.score += 1;
          integral.text = "分數(shù):" + GameMover.Instances.score;
      }
    }
}

寫完后我們將Text值賦值到腳本尖殃,最后我們運行程序測試

Inter.gif

步驟七:設置游戲狀態(tài)

最開始我們的游戲?qū)ο筮菄}鴨是不受重力影響,所以將游戲?qū)ο蟮氖种亓τ绊懭コ⑶覍⑺倪\動學勾選划煮,讓其最開始的時候不做任何運動送丰,

Paste_Image.png

隨后我們在攝像機上的腳本上GameMover加入代碼如下

public class GameMover : MonoBehaviour
{
    //游戲菜單狀態(tài),游戲中弛秋,游戲結(jié)束
    public static int GameState_Menu = 0;
    public static int GameState_Playing = 1;
    public static int GameState_Paser = 2;
    public static int GameState_End= 3;

    public int GameState = GameState_Menu;
      void Update()
    {
       if (GameState==GameState_Menu)
        {
            if (Input.GetMouseButtonDown(0))
            {
                GameState = GameState_Playing;
                dog.SendMessage("DogStart");
            }
        }
    }
}

隨后我們在游戲?qū)ο筮菄}鴨上PlayerAnimator加入代碼代碼如下

public class PlayerAnimator : MonoBehaviour
{
    public void DogStart()
    {
        //給dog施加重力
        GetComponent<Rigidbody>().useGravity = true;
        GetComponent<Rigidbody>().isKinematic = false;
        //給一個恒定力來讓游戲?qū)ο笠恢蓖白?          GetComponent<Rigidbody>().velocity=new Vector3(2,0,0);
    }
}

最后我們測試器躏,最開始我們游戲?qū)ο笫遣皇苤亓Ξ斘覀凕c擊的時候就會受重力影響也就是游戲正式開始


yun.gif

步驟八:觸碰障礙物死亡

首先我們先給所有的障礙物都添加碰撞器,然后我們在障礙物上添加腳本并且給其命名為Daying蟹略,然后我們打開腳本開始寫碰撞方法

public class Daying : MonoBehaviour {

    void OnCollisionEnter(Collision other)
    {
        if (other.transform.tag=="Player")
        {            
            GameMover.Instances.GameState = GameMover.GameState_End;
        }
    }
}

隨后我們在游戲?qū)ο蟮哪_本上PlayerAnimator添加代碼


Paste_Image.png

最后在攝像機上的腳本GameMover添加代碼


Paste_Image.png

這樣我們游戲?qū)ο笤谂鲎驳秸系K物后就會死亡登失,并受重力掉下去.

步驟九:分數(shù)保存

首先我們添加UI并設置位置


Paste_Image.png

然后我們再在panel上添加腳本并且命名為UiSetActier,然后我們在里面寫入腳本如下

using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class UiSetActier : MonoBehaviour
{
    public static UiSetActier _instance;

    public Text highScore;
    public Text nowScore;

       void Awake()
    {
        _instance = this;
        this.gameObject.SetActive(false);//一開始不顯示      
    }   
    //保存分數(shù)
    public void SaveScore(int NowScore)
    {
        //第一次玩 科乎,給一個默認值分數(shù)
        int HighScore = PlayerPrefs.GetInt("Score", 0);

        if (NowScore > HighScore)
        {
            HighScore = NowScore;
        }
        PlayerPrefs.SetInt("Score",HighScore);
        nowScore.text = NowScore.ToString();
        highScore.text = HighScore.ToString();
    }
    public void Onbtnclick()
    {
        if (GameMover.Instances.GameState ==GameMover.GameState_End)
        {
            SceneManager.LoadScene(0);
        }
        else if (GameMover.Instances.GameState == GameMover.GameState_Paser)
        {

        }
    }
}

然后我們在攝像機腳本上GameMover加入以下代碼

   //假如游戲狀態(tài)==結(jié)束
        if (GameState == GameState_End)
        { 
            UiSetActier._instance.gameObject.SetActive(true);
            UiSetActier._instance.SaveScore(score);//調(diào)用面板管理者壁畸,保存分數(shù)
        }

然后我們在將點擊繼續(xù)的按鈕添加上其事件Onbtnclick就大功告成了,
這樣我們就完成了茅茂,最后我們再來看下其結(jié)果吧


OK.gif

我們可以看到完美的運行并且其分數(shù)也保存了下來

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捏萍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子空闲,更是在濱河造成了極大的恐慌令杈,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴倾,死亡現(xiàn)場離奇詭異逗噩,居然都是意外死亡,警方通過查閱死者的電腦和手機跌榔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門异雁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僧须,你說我怎么就攤上這事纲刀。” “怎么了担平?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵示绊,是天一觀的道長。 經(jīng)常有香客問我暂论,道長面褐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任取胎,我火速辦了婚禮展哭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己匪傍,他們只是感情好坝咐,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布增炭。 她就那樣靜靜地躺著祈搜,像睡著了一般寓搬。 火紅的嫁衣襯著肌膚如雪厦画。 梳的紋絲不亂的頭發(fā)上阴颖,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天浮驳,我揣著相機與錄音坊秸,去河邊找鬼谜疤。 笑死柑船,一個胖子當著我的面吹牛帽撑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞍时,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼亏拉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逆巍?” 一聲冷哼從身側(cè)響起及塘,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锐极,沒想到半個月后笙僚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灵再,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年肋层,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翎迁。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡栋猖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汪榔,到底是詐尸還是另有隱情蒲拉,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布揍异,位于F島的核電站全陨,受9級特大地震影響爆班,放射性物質(zhì)發(fā)生泄漏衷掷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一柿菩、第九天 我趴在偏房一處隱蔽的房頂上張望戚嗅。 院中可真熱鬧,春花似錦、人聲如沸懦胞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏尉。三九已至蚯根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胀糜,已是汗流浹背颅拦。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留教藻,地道東北人距帅。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像括堤,于是被迫代替她去往敵國和親碌秸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

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