VR開發(fā)實(shí)戰(zhàn)HTC Vive項(xiàng)目之水果忍者

一、導(dǎo)入素材

二忆嗜、搭建場景

三己儒、生成隨機(jī)水果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;//dotween動(dòng)畫

public class FruitSpawn : MonoBehaviour
{
    //定義一個(gè)生成水果的數(shù)組;
    public  GameObject[] FruitPrefabs;
    
    //定義分?jǐn)?shù)
   public int totalScore;
    //分?jǐn)?shù)文本框
    public Text scoreText;
    //時(shí)間文本框
    public Text timeText;
    //剩余時(shí)間
    private float remainTime;
    //倒計(jì)時(shí)間
    private float countTime=90f;
    //開始時(shí)間捆毫;
    private float startTime;


    //游戲重置UI
    public GameObject reStartUI;

    //游戲重新開始UI位置闪湾;
    public Transform ReStartUIpos;

    //判斷游戲是否結(jié)束標(biāo)志位;
    public bool isGameOver;

    //單例模式 公開的 靜態(tài)的 為了別的類可以直接調(diào)用它 并且節(jié)省內(nèi)存
    public static FruitSpawn instance;
    private void Awake()
    {
        instance = this;
    }


    void Start () {
        //分?jǐn)?shù)開始?xì)w零
        // totalScore = 0;

        //獲取當(dāng)前時(shí)間绩卤;
        //  startTime = Time.time;

        //調(diào)用開始的方法
        Init();
    }
    

    void Update () {
      
        
    }
    //物理時(shí)間相關(guān)
    private void FixedUpdate()
    {
        //判斷游戲是否結(jié)束 是的話即返回途样;
        if (isGameOver)
        {
            return;
        }


        //剩余時(shí)間=倒計(jì)時(shí)間-已經(jīng)過去的時(shí)間  已經(jīng)過去時(shí)間=當(dāng)前時(shí)間減去開始時(shí)間
        remainTime = countTime - (Time.time-startTime);
        //顯示時(shí)間
        timeText.text = Formate(remainTime);

        //判斷時(shí)間小于等于0江醇;游戲結(jié)束;
        if (remainTime<=0)
        {
            GameOver();
        }

    }

    //格式化時(shí)間
    private string Formate(float time) {

        string timeStr;
        int timeFormate = (int)time;
        //三目運(yùn)算符
        timeStr = time > 10 ? "00:" + timeFormate.ToString() : "00:0" + timeFormate.ToString();
        return timeStr;

    }

    /// <summary>
    /// 開始生成水果
    /// </summary>
    private void StartSpawnFruit() { 
    
        //開啟協(xié)程方法
      
       StartCoroutine(SpawnFruit());
    }

    //開啟協(xié)程 隔時(shí)間段生成水果何暇;
    IEnumerator SpawnFruit() { 
    
        //生成水果
        while (true)
        {
            //隨機(jī)生成水果
            GameObject Fruit = Instantiate(FruitPrefabs[Random.Range(0,FruitPrefabs.Length-1)]);
            //給水果隨機(jī)位置
            Fruit.transform.position=transform.position+transform.right*(Random.Range(-1.0f,1.0f));
            //獲取水果剛體組件陶夜;
            Rigidbody rigi= Fruit.GetComponent<Rigidbody>();
            //給一個(gè)向上的速度;
            rigi.velocity = new Vector3(0,5f,0);
            //給水果添加隨機(jī)角速度 有翻滾效果裆站;
            rigi.angularVelocity = new Vector3(0, 0, Random.Range(-5.0f, 5.0f));
            //重力生效
            rigi.useGravity = true;
            //每隔3秒就生成水果
            yield return new WaitForSeconds(3f);
        }      
    }

    //定義一個(gè)公開的加分方法 被切割時(shí)調(diào)用
    public void AddScore(int score) {
        totalScore += score;
        scoreText.text = totalScore.ToString();
    }


    //游戲結(jié)束方法
    private void GameOver() {
        
        //判斷游戲未結(jié)束条辟;
        if (!isGameOver)
        {
            //實(shí)例化結(jié)束UI;
            GameObject Restart = Instantiate(reStartUI);
            //確定位置
            Restart.transform.position = ReStartUIpos.position;
            //動(dòng)畫效果 設(shè)置初始值為0宏胯;
            Restart.transform.localScale = Vector3.zero;
            //實(shí)現(xiàn)動(dòng)畫關(guān)鍵語句
            Restart.transform.DOScale(Vector3.one*20,0.5f);


            //游戲結(jié)束
            isGameOver = true;

            //關(guān)閉所有協(xié)程 不能實(shí)例化水果
            StopAllCoroutines();
        }
       
    }

    //游戲重新開始
    public void ReStartGames() {

        //重新開始的時(shí)候延遲調(diào)用
        Invoke ("Init",2f);
    }

    //初始化游戲
    private void Init() {
        //分?jǐn)?shù)開始?xì)w零
        totalScore = 0;

        //獲取當(dāng)前時(shí)間羽嫡;
        startTime = Time.time;
        //開始界面初始化
        StartSpawnFruit();
        //分?jǐn)?shù)初始化 歸零
        scoreText.text = "0";
        //時(shí)間初始化
        timeText.text = "00:00";
        //標(biāo)志位也初始化
        isGameOver = false;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fruit : MonoBehaviour {


    void Start () {
        
    }
    
  //提高性能,銷毀水果
    void Update () {
        //判斷水果Y位置小于-10時(shí)肩袍,銷毀杭棵;
        if (this.transform.position.y<-10.0f)
        {
            Destroy(this.gameObject);
        }

    }
}

四、給玩家添加武器

五了牛、添加武器特效

六颜屠、核心機(jī)制-切

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwrodCutter : MonoBehaviour {

    //定義一個(gè)公開的持有引用 被切割后的材質(zhì)  切面 材質(zhì)
    public Material capMaterial;

    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }


    //刀與水果發(fā)生碰撞后處理的函數(shù)
    public void OnCollisionEnter(Collision coll) {

        //獲取被到碰撞后的物體
        GameObject victim = coll.collider.gameObject;
        //切面處理
        GameObject[] pieces = BLINDED_AM_ME.MeshCut.Cut(victim, transform.position, transform.right, capMaterial);//參數(shù)1:切割對象  參數(shù)2:發(fā)生碰撞的位置 參數(shù)3:切割方向 水平方向坐標(biāo) 參數(shù)4:被切割后顯示的材質(zhì);

        //去掉水果碰撞體鹰祸,避免重復(fù)切割甫窟;
       // pieces[1].GetComponent<MeshCollider>().enabled = false;

        //添加剛體 有下落的效果
        if (!pieces[1].GetComponent<Rigidbody>())
            pieces[1].AddComponent<Rigidbody>();

        //一秒過后 銷毀對象
        Destroy(pieces[1], 1);

        //判斷特定UI重新開始游戲
        if (victim.tag == "GameOverUI")
        {
            //游戲重新開始 調(diào)用單利模式 重新開始方法;
            FruitSpawn.instance.ReStartGames();

            //獲取剛體
            Rigidbody rigi = GetComponent<Rigidbody>();
            //使用重力
            rigi.useGravity = true;
            //一秒后銷毀
            Destroy(pieces[0], 1);

        }
        else {//切的不是游戲結(jié)束界面
            //被切割后 加分 調(diào)用單例
            FruitSpawn.instance.AddScore(10);
        }

  
    }
}

七、UI搭建

八蛙婴、處理分?jǐn)?shù)和時(shí)間

九粗井、制作重置UI

十、游戲重新開始

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末街图,一起剝皮案震驚了整個(gè)濱河市浇衬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌餐济,老刑警劉巖耘擂,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異絮姆,居然都是意外死亡醉冤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門篙悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚁阳,“玉大人,你說我怎么就攤上這事鸽照÷菥瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長定血。 經(jīng)常有香客問我赔癌,道長,這世上最難降的妖魔是什么澜沟? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任届榄,我火速辦了婚禮,結(jié)果婚禮上倔喂,老公的妹妹穿的比我還像新娘。我一直安慰自己靖苇,他們只是感情好席噩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贤壁,像睡著了一般悼枢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脾拆,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天馒索,我揣著相機(jī)與錄音,去河邊找鬼名船。 笑死绰上,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渠驼。 我是一名探鬼主播蜈块,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迷扇!你這毒婦竟也來了百揭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜓席,失蹤者是張志新(化名)和其女友劉穎器一,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厨内,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祈秕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘庄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踢步。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丑掺,靈堂內(nèi)的尸體忽然破棺而出获印,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布兼丰,位于F島的核電站玻孟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳍征。R本人自食惡果不足惜黍翎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艳丛。 院中可真熱鬧匣掸,春花似錦、人聲如沸氮双。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戴差。三九已至送爸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暖释,已是汗流浹背袭厂。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留球匕,地道東北人纹磺。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像谐丢,于是被迫代替她去往敵國和親爽航。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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