Unity3D開發(fā)實(shí)戰(zhàn)之守護(hù)森林

框架視圖

守護(hù)森林.png

關(guān)鍵代碼

Bird

public class Bird : MonoBehaviour
{

    //控制材料中的貼圖狀態(tài) 要知道計(jì)時(shí)器 每秒總幀數(shù) 幀數(shù)計(jì)算器

    //定義計(jì)時(shí)器變量

    public float timer = 0;

    //定義幀數(shù)量 也就是每秒鐘要顯示幀數(shù)较锡;

    public int frameNumber = 10;

    //定義幀數(shù)計(jì)數(shù)器

    public int frameCount = 0;


    //定義兩個(gè)變量 是否播放動(dòng)畫 是否控制跳躍络它;
    public bool animation = false;
    public bool canJump = false;

    void Start()
    {

        //添加剛體組件

        //給剛體施加一個(gè)向右的力(速度)
        // gameObject.GetComponent<Rigidbody>().velocity = new Vector3(5,0,0);
        //  gameObject.GetComponent<Rigidbody>().velocity = new Vector3(2, 0, 0);
        //第二種加力的方法拍冠;
        // gameObject.GetComponent<Rigidbody>().AddForce(Vector3.right*50,ForceMode.Force);

    }


    void Update()
    {

        //判斷是否是可以播放動(dòng)畫的時(shí)候
        //if (animation)
        //{
        if (GameMannger._intance.gameState ==GameMannger.GAMESTATE_PLAYING)
        {
            //給一個(gè)恒定的速度掸茅,測(cè)試之用
            //Vector3 vel = gameObject.GetComponent<Rigidbody>().velocity;
            //gameObject.GetComponent<Rigidbody>().velocity = new Vector3(5, vel.y, vel.z);
            //計(jì)時(shí)
            timer += Time.deltaTime;

            //如果時(shí)間超過每秒鐘顯示的總幀數(shù) 幀數(shù)++仪际;時(shí)間重新歸零 
            if (timer >= 1.0f / frameNumber)
            {
                //幀數(shù)++姑丑;
                frameCount++;
                // timer -= Time.deltaTime ;
                timer -= Time.deltaTime + 0.05f;  //加個(gè)時(shí)間讓她抖動(dòng)的慢點(diǎn)

                //定義每幀的下標(biāo)陨晶;取余  framrcount++  1/3取余是1 2/3取余是2 3/3取余是0 4/3 取余是1 5/3取余是2 6/3取余是0 或者理解理解成0查牌,1对碌,2荆虱,0,1朽们,2...
                int frameIndex = frameCount % 3;
                //更新材質(zhì)的 偏移值 X怀读;
                //怎樣去設(shè)置這個(gè)偏移值 X 的屬性呢?
                //獲取本游戲?qū)ο笙碌?渲染組件 的 材質(zhì)(材質(zhì)復(fù)數(shù)時(shí)是數(shù)組)的設(shè)置 貼圖偏移值 x

                gameObject.GetComponent<Renderer>().material.SetTextureOffset("_MainTex", new Vector2(0.3333f * frameIndex, 0));//參數(shù)1:表示本材質(zhì)的主要貼圖(著色器的主要貼圖)骑脱,參數(shù)2:要改變的二維向量菜枷;

            }
        }

        //判斷是否跳躍的時(shí)候才可以跳躍
        //if (canJump)
        //{

        if (GameMannger._intance.gameState == GameMannger.GAMESTATE_PLAYING)
        {
            //判斷點(diǎn)擊鼠標(biāo) 給一個(gè)向上的速度 向上跳躍

            if (Input.GetMouseButtonDown(0))
            {
                //添加聲音后按下跳躍時(shí)播放扇動(dòng)翅膀的聲音
                gameObject.GetComponent<AudioSource>().Play();

                //獲取當(dāng)前的速度;
                Vector3 vel2 = gameObject.GetComponent<Rigidbody>().velocity;
                //給y軸向上的速度叁丧;

                gameObject.GetComponent<Rigidbody>().velocity = new Vector3(vel2.x, 5.0f, vel2.z);

            }
        }

    }


    /// <summary>
    /// 激活小鳥的方法 用來發(fā)送方法來調(diào)用的啤誊;
    /// </summary>
    public void getLife() {        
        gameObject.GetComponent<Rigidbody>().useGravity = true; 
        gameObject.GetComponent<Rigidbody>().velocity = new Vector3(2,0,0);
    
    }

    /// <summary>
    ///     接觸地面后 加大阻力 不讓小鳥再次滾動(dòng)岳瞭;
    /// </summary>
    /// <param name="coll"></param>
    void OnCollisionEnter(Collision coll) {


      //  Debug.Log(coll.gameObject.name);

        if (coll.gameObject.name == "back")
        {
            //this.gameObject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
            this.gameObject.GetComponent<Rigidbody>().drag = 1000f;
            this.gameObject.GetComponent<Rigidbody>().angularDrag = 1000f;

           // Debug.Log(this.gameObject.name);
        }
    
    }
}

FollowBird

public class FollowBird : MonoBehaviour {

    //跟隨相機(jī)
    //定義一個(gè)游戲?qū)ο笥脕韺ふ倚▲B的
    private GameObject bird;

    //為跟隨位置定義好的變量
    private Transform birdTransform;

    //定義好一個(gè)偏移值的變量;
    Vector3 offset;

    void Start () {

        //尋找游戲?qū)ο?小鳥 并且賦值蚊锹;
        bird = GameObject.FindGameObjectWithTag("Player");//gameobject是單數(shù)瞳筏,不是復(fù)數(shù);
        birdTransform = bird.transform;
        //計(jì)算偏移值牡昆;
         offset = gameObject.GetComponent<Transform>().position - birdTransform.position;   
    }
    

    void Update () {

        Vector3 birdPos = birdTransform.position;

        //判斷不要將攝像機(jī)超出邊界姚炕;
        if (birdPos.y>5f)//上界
        {
            birdPos.y = 5f;
        }

        if (birdPos.y<2.5f)
        {
            birdPos.y =2.5f;
        }

        //相機(jī)位置跟隨 不斷補(bǔ)償偏移值;
       // gameObject.GetComponent<Transform>().position = birdTransform.position + offset;
        gameObject.GetComponent<Transform>().position = birdPos + offset;

    }
}

GameMannger

public class GameMannger : MonoBehaviour {
    
    
    //定義游戲的狀態(tài)迁杨;
    public static int GAMESTATE_MENU = 0;
    public static int GAMESTATE_PLAYING = 1;
    public static int GAMESTATE_END = 2;
    //只有3個(gè)背景圖钻心,不斷循環(huán) 進(jìn)入背景2 的時(shí)候 把背景1移到背景3 中去

    public Transform firstBG;


    //每個(gè)管道口設(shè)置一個(gè)觸發(fā)器,闖過一個(gè)得一分铅协;
    
    //定義一個(gè)分?jǐn)?shù)的變量;
    public int score=0;
    
    //定義一個(gè)游戲狀態(tài)
    public int gameState = GAMESTATE_MENU;

    //定義一個(gè)鳥的游戲?qū)ο?并在初始化時(shí)賦值
    private GameObject bird;


    //單例模式

    public static GameMannger _intance;

    void Awake() {
        _intance = this;   //單例模式模板 得到的是gamemannger類型摊沉;
        //給鳥賦值狐史;
        bird = GameObject.FindGameObjectWithTag("Player");
    }


    void Update() { 
    
        //判斷當(dāng)前的游戲狀態(tài);
        if (gameState==GAMESTATE_MENU)
        {
            //判斷是否點(diǎn)擊屏幕
            if (Input.GetMouseButtonDown(0))
            {
                //設(shè)置游戲的狀態(tài)
                gameState = GAMESTATE_PLAYING;              
                //播放動(dòng)畫 和 是否能跳躍 對(duì)鳥設(shè)置重力
                //bird.GetComponent<Rigidbody>().useGravity = true;              
                ////添加X軸方向的力说墨;
                //bird.GetComponent<Rigidbody>().velocity = new Vector3(1,0,0);
                //綜上 我們可以封裝成一個(gè)方法 在此調(diào)用方法時(shí) 發(fā)送一個(gè)方法名骏全;
                bird.SendMessage("getLife");
            }
        }


        //判斷游戲是結(jié)束狀態(tài),把結(jié)束界面顯示出來尼斧;
        if (gameState == GAMESTATE_END)
        {
            GameMenu._instance.gameObject.SetActive(true);//參數(shù)設(shè)置為true姜贡;
            //把分?jǐn)?shù)轉(zhuǎn)遞給結(jié)束的界面 顯示最后得分
            GameMenu._instance.UpdateScore(score);
        }   
    }
}

GameMenu

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameMenu : MonoBehaviour {
    //聲明持有兩個(gè)分?jǐn)?shù)引用的變量;
    public GUIText bestScore;
    public GUIText nowScore;
    //聲明持有重新開始的游戲貼圖棺棵;
    public GUITexture startTexture;

    //單例模式
    public static GameMenu _instance;

    void Awake()
    {
        _instance = this;
        this.gameObject.SetActive(false);  //默認(rèn)是不調(diào)用的楼咳;
    }



    //更新分?jǐn)?shù)的方法 公開的 才可以調(diào)用
    public void UpdateScore(float currentScore)
    {
        //用來獲取最高分?jǐn)?shù)的關(guān)鍵詞 piayerprefs;
        float highScore = PlayerPrefs.GetFloat("score", 0);//參數(shù)1:通過key關(guān)鍵詞 score查找最高分?jǐn)?shù)  參數(shù)2:默認(rèn)是0烛恤;因?yàn)榈谝淮螞]有最高分?jǐn)?shù)母怜,默認(rèn)值設(shè)置為0;


        //判斷一下 現(xiàn)在傳過來的分?jǐn)?shù)跟最高分?jǐn)?shù)對(duì)比缚柏,更新下最高分苹熏;
        if (highScore < currentScore)
        {
            highScore = currentScore;
        }


        //用來保存最高分?jǐn)?shù)的關(guān)鍵詞 PlayerPrefs;
        PlayerPrefs.SetFloat("score", highScore);



        //將分?jǐn)?shù)顯示出來币喧;
        bestScore.text = highScore.ToString();
        nowScore.text = currentScore.ToString();
        //這個(gè)方法會(huì)被GameMannger調(diào)用

        //判斷結(jié)束界面之后重新開始轨域;
        //首先判斷鼠標(biāo)點(diǎn)下和游戲處于結(jié)束狀態(tài)
        if (Input.GetMouseButtonDown(0)&&GameMannger._intance.gameState==GameMannger.GAMESTATE_END)
        {
            //獲取重新開始游戲貼圖的位置 關(guān)鍵語句 GetScreenRect()
            Rect rect = startTexture.GetScreenRect();

            //再次判斷點(diǎn)擊的位置是否在區(qū)域范圍內(nèi);
            //先獲取鼠標(biāo)的位置
            Vector3 mousePos=Input.mousePosition;

            //判斷鼠標(biāo)點(diǎn)擊的范圍
            if (mousePos.x>rect.x&&
                mousePos.x<(rect.x+rect.width)&&
                mousePos.y>rect.y&&
                mousePos.y<(rect.y+rect.height)
                )
            {
                ////改變游戲狀態(tài)杀餐;
                //GameMannger._intance.gameState = GameMannger.GAMESTATE_PLAYING;
                ////隱藏本界面
                //this.gameObject.SetActive(false);  //默認(rèn)是不調(diào)用的干发;
                //重新加載場(chǎng)景
                SceneManager.LoadScene(0);
            }
        }
    }
}

MoveTrigger

public class MoveTrigger : MonoBehaviour {
    //定義一個(gè)公開的背景
    public Transform currentBG;
    //定義持有兩個(gè)管道的應(yīng)用
    public Pipe pipe1;
    public Pipe pipe2;
    //觸發(fā)事件 看誰觸發(fā)了我,判斷后 將背景1 移到背景2去

   public  void OnTriggerEnter(Collider coll) {

        if (coll.tag=="Player")
        {
            //第一步 得到放在游戲管理器的第一個(gè)bg的Transform怜浅;
         Transform firstBg=GameMannger._intance.firstBG;
            //第二步  移動(dòng)铐然; 改變位置蔬崩;
         currentBG.transform.position = new Vector3(firstBg.position.x+10f,currentBG.transform.position.y,currentBG.transform.position.z);
            //第三部 把背景圖更新為當(dāng)前的位置;
         GameMannger._intance.firstBG = currentBG;            
            //第四步 隨機(jī)生成管道的位置搀暑;
           //定義 持有管道的引用 調(diào)用起方法生成隨機(jī)位置沥阳;
         pipe1.RandomGeneratePosition();
         pipe2.RandomGeneratePosition();
        }    
    }
}

Pipe

public class Pipe : MonoBehaviour { 
    void Start () { 
        //測(cè)試是否隨機(jī);
        RandomGeneratePosition();
    }
    /// <summary>
    /// 讓Y軸的位置隨機(jī) 隨機(jī)范圍是-0.1至-0.4自点;
    /// </summary>
    public void RandomGeneratePosition() {
        float pos_Y = Random.Range(-0.4f,-0.1f);  //參數(shù)1:最小值 參數(shù)2:最大值桐罕;
        //本地坐標(biāo)
        gameObject.transform.localPosition = new Vector3(gameObject.transform.localPosition.x,pos_Y,gameObject.transform.position.z);    
    }

    /// <summary>
    /// 判斷是否通過管道,加一分
    /// </summary>
    void OnTriggerExit(Collider coll) { //觸犯3 個(gè)事件  OnTriggerEnter OnTriggerStay OnTriggerExit

        if (coll.tag=="Player")
        {
            //播放得分聲音
            gameObject.GetComponent<AudioSource>().Play();

            //加分 調(diào)用單例模式靜態(tài)的方法 的分?jǐn)?shù)++
            GameMannger._intance.score++;
        }
    
    }

    /// <summary>
    /// ongui事件
    /// </summary>
    void OnGUI() { 
        //顯示分?jǐn)?shù)桂敛;
       // GUILayout.Label(GameMannger._intance.score.ToString());
        GUILayout.Label("Score:"+GameMannger._intance.score);
    }

}

PipeCollision

public class PipeCollision : MonoBehaviour {
    //定義兩個(gè) 碰撞的聲音 小鳥結(jié)束的聲音 的變量
    public AudioSource hitMusic;
    public AudioSource dieMusic;

    /// <summary>
    /// 檢測(cè)小鳥碰撞到管道功炮,游戲結(jié)束 在結(jié)束前播放碰撞的聲音
    /// </summary>
    void OnCollisionEnter(Collision coll)
    {

        if (coll.gameObject.tag == "Player")
        {
            //播放碰撞的聲音
            //gameObject.GetComponent<AudioSource>().Play();
            hitMusic.Play();
            //播放小鳥結(jié)束的聲音
            dieMusic.Play();
            //切換游戲狀態(tài)
            GameMannger._intance.gameState = GameMannger.GAMESTATE_END;
        }

    }
}

守護(hù)森林.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市术唬,隨后出現(xiàn)的幾起案子薪伏,更是在濱河造成了極大的恐慌,老刑警劉巖粗仓,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫁怀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡借浊,警方通過查閱死者的電腦和手機(jī)塘淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚂斤,“玉大人存捺,你說我怎么就攤上這事∈镎簦” “怎么了捌治?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逸爵。 經(jīng)常有香客問我具滴,道長(zhǎng),這世上最難降的妖魔是什么师倔? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任构韵,我火速辦了婚禮,結(jié)果婚禮上趋艘,老公的妹妹穿的比我還像新娘疲恢。我一直安慰自己,他們只是感情好瓷胧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布显拳。 她就那樣靜靜地躺著,像睡著了一般搓萧。 火紅的嫁衣襯著肌膚如雪杂数。 梳的紋絲不亂的頭發(fā)上宛畦,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音揍移,去河邊找鬼次和。 笑死,一個(gè)胖子當(dāng)著我的面吹牛那伐,可吹牛的內(nèi)容都是我干的踏施。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼罕邀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼畅形!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诉探,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤日熬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后阵具,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍遍,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年阳液,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揣炕。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帘皿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畸陡,到底是詐尸還是另有隱情鹰溜,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布丁恭,位于F島的核電站曹动,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牲览。R本人自食惡果不足惜墓陈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望第献。 院中可真熱鬧贡必,春花似錦、人聲如沸庸毫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飒赃。三九已至利花,卻和暖如春科侈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炒事。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工臀栈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羡洛。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓挂脑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欲侮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崭闲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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