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

本問轉(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)象?。?! 那么,我們換另一個(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 () {
        //如果腳本所在模型的名字為L(zhǎng)eftCube(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容