【轉(zhuǎn)】 Unity3D新手教學(xué),讓你十二小時(shí)察迟,從入門到掌握U队(三 )

本問轉(zhuǎn)自:http://blog.csdn.net/aries_h/article/details/47703835

這一講,我會(huì)教大家如何寫碰撞檢測(cè)的代碼扎瓶,然后還會(huì)教大家如何使用我介紹給大家的第一個(gè)Unity的插件所踊。 那么,廢話不多說概荷,我先介紹插件如何下載和安裝污筷。
VS For Unity 下載鏈接
進(jìn)入這個(gè)頁面,按編譯器版本進(jìn)行下載,我用的是2010瓣蛀,所以要下載這個(gè)。

這里寫圖片描述

安裝就不用我教了雷厂,下面開始看我是如何導(dǎo)入U(xiǎn)nity VS的惋增。
這里寫圖片描述

這里寫圖片描述

點(diǎn)擊Import之后我們會(huì)發(fā)現(xiàn)并沒有發(fā)生什么,但是接下來我們按一下刷新的快捷鍵:Ctrl+F(F:Flush)就會(huì)看到上面多出來一個(gè)東西改鲫。 點(diǎn)擊Open以后就會(huì)自動(dòng)打開VS了诈皿。
這里寫圖片描述

OK,插件安裝完畢像棘,接下來教大家如何做碰撞檢測(cè)稽亏。
發(fā)生碰撞需要兩個(gè)條件,碰撞體要一個(gè)具有剛體缕题,一個(gè)具有碰撞器截歉。
上一講我們已經(jīng)為Cube添加了碰撞器,并且選擇了Is Trigger的觸發(fā)器烟零,那么我們現(xiàn)在開始編寫碰撞檢測(cè)的代碼瘪松。
在Scripts文件夾下新建一個(gè)名為PlayerCollision的C#腳本。
在寫代碼之前锨阿,我要介紹一下碰撞檢測(cè)有好多種: OnTriggerEnter( Collider other )當(dāng)進(jìn)入觸發(fā)器 OnTriggerExit( Collider other )當(dāng)退出觸發(fā)器 OnTriggerStay( Collider other )當(dāng)逗留觸發(fā)器 OnCollisionEnter( Collision collisionInfo ) 當(dāng)進(jìn)入碰撞器 OnCollisionExit( Collision collisionInfo ) 當(dāng)退出碰撞器 OnCollisionStay( Collision collisionInfo ) 當(dāng)逗留碰撞器
以上這六個(gè)方法都是MonoBehaviour里面的宵睦,因?yàn)槲覀兊哪_本都是繼承的MonoBehaviour這個(gè)類。所以我們的腳本里面可以覆蓋這六個(gè)方法墅诡。
因?yàn)槲覀児催x了Is Trigger壳嚎,所以,我們覆蓋OnTriggerEnter( Collider other )方法:

//當(dāng)進(jìn)入碰撞器的方法
     public void OnTriggerEnter(Collider other)
     {
         //如果碰撞的GameObject不是Floor
         if(!other.gameObject.name.Equals("Floor"))
         {
             print("報(bào)告主人:觸發(fā)器成功觸發(fā)末早!");
         }
     }

然后烟馅,將這段代碼托給Player,運(yùn)行游戲荐吉。


這里寫圖片描述

如圖所示焙糟,碰撞的確發(fā)生了,但是Player卻穿過了Cube样屠。 這并不是一個(gè)好現(xiàn)象4┐椤!痪欲! 那么悦穿,我們換另一個(gè)方法,將碰撞器的Is Trigger取消业踢。 然后再將代碼改為:

public void OnCollisionEnter(Collision other)
    {
        //如果碰撞的GameObject不是Floor
        if (!other.gameObject.name.Equals("Floor"))
        {
            print("報(bào)告主人:觸發(fā)器成功觸發(fā)栗柒!");
        }
    }

這里寫圖片描述

那么,這時(shí)候可能有人會(huì)問我,剛開始我導(dǎo)入的插件又有什么用呢瞬沦?
現(xiàn)在我給大家介紹一下太伊,我最喜換這個(gè)插件其中的一個(gè)最喜歡的功能!
在VS里編輯代碼的時(shí)候逛钻,我們按下快捷鍵Ctrl+Shift+Q會(huì)彈出一個(gè)框框僚焦。
這里包括了我們繼承了MonoBehaviour里面的所有的類。
我們?cè)诶锩孑斎隣n為示范曙痘,他會(huì)自動(dòng)為我們索引出一切有關(guān)On的方法:
這里寫圖片描述

是不是很好用呢芳悲?
那么現(xiàn)在我們碰撞檢測(cè)可以實(shí)現(xiàn)了,我們應(yīng)該怎么實(shí)現(xiàn)落在Cube上的時(shí)候使Cube停止運(yùn)動(dòng)呢边坤?
隨便問一個(gè)不懂編程的人都會(huì)說名扛,讓他不能動(dòng)不就動(dòng)不了了。
對(duì)啊茧痒,我們將Cube運(yùn)動(dòng)的代碼取消不就不能運(yùn)動(dòng)了肮韧,那么我們?cè)?strong>如何在游戲運(yùn)行的時(shí)候取消Cube運(yùn)動(dòng)的代碼呢?
我們將LeftCube移動(dòng)到Floor前面文黎。只要在發(fā)生碰撞的時(shí)候我們這么寫:

public void OnCollisionEnter(Collision other)
    {
        //定義一個(gè)字符串
        string CollisionName;

        //如果碰撞的GameObject不是Floor
        if (!other.gameObject.name.Equals("Floor"))
        {
            //將碰撞體的名字存在字符串中
            CollisionName = other.gameObject.name;

            //如果碰撞體的名字是LeftCube
            if(CollisionName.Equals("LeftCube"))
            {
                //獲取LeftCube身上的LeftCubeMove腳本惹苗,并切取消此代碼的執(zhí)行。
                other.gameObject.GetComponent<LeftCubeMove>().enabled = false;
            }
        }
    }

這時(shí)我們?cè)龠\(yùn)行游戲耸峭,并使Player與LeftCube發(fā)生碰撞.:

這里寫圖片描述

可以看到桩蓉,在碰撞的一瞬間,Cube不移動(dòng)了劳闹,并且右邊LeftCubeMove的腳本被取消了院究。
這樣我們是否就可以做到落在Cube上就停止他的運(yùn)動(dòng)了呢?
并不然本涕!
我們總不能每發(fā)生碰撞都判斷一下碰撞體的名稱然后再進(jìn)行取消腳本吧业汰。
還記得在第二講我曾經(jīng)說過:(總不會(huì)寫兩個(gè)吧?向左一個(gè)單獨(dú)的代碼菩颖,向右一個(gè)單獨(dú)的代碼样漆?)
現(xiàn)在,我來解決這個(gè)問題晦闰。
馬上新建一個(gè)命為CubeMove的C#腳本放祟。代碼如下:

public class CubeMove : MonoBehaviour {
    //定義Cube的初始速度
    public float Speed = 1f;

    void Start () {

    }

    void Update () {
        //如果腳本所在模型的名字為LeftCube(Clone)或LeftCube
        if (this.gameObject.name.Equals("LeftCube(Clone)") || this.gameObject.name.Equals("LeftCube"))
        {
            //執(zhí)行移動(dòng)方法
            MoveLeft();
        }

        if (this.gameObject.name.Equals("RightCube(Clone)") || this.gameObject.name.Equals("RightCube"))
        {
            MoveRight();
        }
        if (this.gameObject.name.Equals("StaticCube(Clone)") || this.gameObject.name.Equals("StaticCube"))
        {
            MoveStop();
        }
    }
    //定義移動(dòng)方法
    void MoveLeft()
    {
        //使Cube的移動(dòng)速度遞增
        Speed += 0.1f;
        //移動(dòng)
        this.transform.Translate(Vector3.left * Speed * Time.deltaTime);
    }
    void MoveRight()
    {
        Speed += 0.1f;
        this.transform.Translate(Vector3.right * Speed * Time.deltaTime);
    }
    void MoveStop()
    {
        this.transform.Translate(0,0,0);
    }
}

這樣,我們所有可經(jīng)過的Cube就都可以公用一個(gè)腳本了呻右。
我們將所有Cube單獨(dú)控制移動(dòng)的代碼都取消掉跪妥,然后將CubeMove的腳本托給所有Cube,別忘了StaticCube也要給声滥。
然后我們修改一下PlayerCollision腳本的代碼:

//當(dāng)進(jìn)入碰撞器的方法
   public void OnCollisionEnter(Collision other)
   {
       //如果碰撞的GameObject不是Floor
       if (!other.gameObject.name.Equals("Floor"))
       {
           //取消碰撞體上的CubeMove方法
           other.gameObject.GetComponent<CubeMove>().enabled = false;
       }

   }

這樣眉撵,我們就可以簡(jiǎn)化代碼,并且便于管理,而且任何人都能看懂你的代碼纽疟!
謝謝的大家的關(guān)注罐韩,那么這一講就到此結(jié)束,下一講我會(huì)講解如何使Player落在Cube上時(shí)出現(xiàn)下一個(gè)Cube污朽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伴逸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膘壶,更是在濱河造成了極大的恐慌,老刑警劉巖洲愤,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颓芭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柬赐,警方通過查閱死者的電腦和手機(jī)亡问,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛宋,“玉大人州藕,你說我怎么就攤上這事≡统拢” “怎么了床玻?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沉帮。 經(jīng)常有香客問我锈死,道長,這世上最難降的妖魔是什么穆壕? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任待牵,我火速辦了婚禮,結(jié)果婚禮上喇勋,老公的妹妹穿的比我還像新娘缨该。我一直安慰自己,他們只是感情好川背,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布贰拿。 她就那樣靜靜地躺著,像睡著了一般渗常。 火紅的嫁衣襯著肌膚如雪壮不。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天皱碘,我揣著相機(jī)與錄音询一,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛健蕊,可吹牛的內(nèi)容都是我干的菱阵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缩功,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晴及!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫡锌,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤虑稼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后势木,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛛倦,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年啦桌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溯壶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甫男,死狀恐怖且改,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情板驳,我是刑警寧澤又跛,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站笋庄,受9級(jí)特大地震影響效扫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜直砂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一菌仁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静暂,春花似錦济丘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至郊供,卻和暖如春峡碉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驮审。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工鲫寄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吉执,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓地来,卻偏偏與公主長得像戳玫,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未斑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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