碰撞器檢測(cè)和觸發(fā)器檢測(cè)

無(wú)論是碰撞檢測(cè)還是觸發(fā)檢測(cè),他們都基于Collider組件。兩個(gè)游戲?qū)ο蟀l(fā)生碰撞時(shí),碰撞器可以產(chǎn)生系統(tǒng)默認(rèn)的碰撞產(chǎn)生的物理效果;觸發(fā)器可以讓用戶自定義碰撞后產(chǎn)生的物理效果,如爆炸、消失等。
在Unity中,用來(lái)檢測(cè)碰撞的方法有三種:碰撞檢測(cè)、觸發(fā)檢測(cè)、射線檢測(cè)。在這里我們只講解碰撞檢測(cè)和觸發(fā)檢測(cè)。

一、碰撞檢測(cè)

首先在Unity里面,碰撞器是一種組件,有很多種類,大致分為兩類:基本碰撞器和非基本碰撞器;其中基本碰撞器包括Box Collider(Cube游戲物體自帶的碰撞器)、Sphere Collider(Sphere自帶的碰撞器)、Capsule Collider(Capsule自帶)等,而非基本碰撞器包括Wheel Collider(車輪碰撞器)、Mesh Collider(網(wǎng)格碰撞器,Plane自帶)等。

基本碰撞器的屬性基本都一樣,只是因?yàn)樾螤畈灰粯佣袛?shù)值上的差異,而非基本碰撞器比較特殊,每一個(gè)都可以拿出來(lái)單獨(dú)介紹。這里我們?cè)敿?xì)講解一下基本碰撞器,而非基本碰撞器我們后續(xù)章節(jié)再做詳細(xì)介紹。
如圖1.1和1.2分別是Cube和Sphere自帶的碰撞器:

圖1.1
圖1.2

對(duì)比兩張圖片我們可以看出它們都擁有Edit Collider、Is Trigger、Material、Center屬性,因?yàn)樾螤畹牟煌艜?huì)有了Size和Radius的差別。

1、Edit Collider

單擊選中一個(gè)游戲?qū)ο蟮腅dit Collider選項(xiàng)后,游戲?qū)ο笊砩蠒?huì)出現(xiàn)包裹全身的網(wǎng)格,上面還有光點(diǎn),如圖1.3:

圖1.3

點(diǎn)擊鼠標(biāo)左鍵拖動(dòng)光點(diǎn),就可以改變Size或者Radius等的大小,也就是改變了碰撞器的大小。

2、Is Trigger

這個(gè)屬性就是碰撞器和觸發(fā)器的區(qū)別,勾選這個(gè)屬性就是觸發(fā)器,不勾選就是碰撞器。這里我們先不勾選。

3、Material-材質(zhì)

默認(rèn)是None,可以添加其它物理材質(zhì)(Physic Material),用來(lái)設(shè)置彈性系數(shù)和摩擦系數(shù),上一章有介紹。

4、Center

用來(lái)調(diào)整Collider的位置,如圖1.4:

圖1.4

由圖可以看出Collider的位置和游戲?qū)ο笪恢貌⒉粵_突,兩方都是獨(dú)立的,一個(gè)游戲?qū)ο蟮哪J(rèn)碰撞器的位置和游戲?qū)ο蟊旧淼奈恢靡恢隆?/p>

5、Unity中碰撞器有三個(gè)自帶的方法,當(dāng)游戲?qū)ο蟀l(fā)生碰撞時(shí)調(diào)用,他們分別是OnCollisionEnter、OnCollisionStay、OnCollisionExit,這就是所謂的碰撞檢測(cè)方法。

OnCollisionEnter:兩個(gè)碰撞游戲?qū)ο蟮呐鲎财鲃偨佑|時(shí)(注意,不是游戲?qū)ο蠼佑|,是游戲?qū)ο笊系呐鲎财?Collider組件接觸)調(diào)用一次。
OnCollisionStay:兩個(gè)游戲?qū)ο蟮呐鲎财鹘佑|時(shí)調(diào)用,只要兩個(gè)碰撞器一直在接觸,就會(huì)一直調(diào)用該方法。
OnCollisionExit:兩個(gè)游戲?qū)ο蟮呐鲎财飨嗷シ蛛x時(shí)調(diào)用一次。

下面用幾個(gè)情形來(lái)說(shuō)明一下什么條件(兩個(gè)游戲?qū)ο笫欠駧в袆傮w和碰撞器)下會(huì)調(diào)用上述三種碰撞檢測(cè)方法。
情形一:兩個(gè)游戲?qū)ο蠖季哂袆傮w和碰撞器時(shí)

我們先給兩個(gè)游戲?qū)ο螅–ube和Sphere)分別添加剛體,這兩個(gè)游戲?qū)ο蠖甲詭в信鲎财?Collider,這里我們不要改變Collider的Center的值,讓Collider和物體位置一致;然后我們給兩個(gè)物體都添加一個(gè)腳本,腳本的內(nèi)容就是利用上述三種方法在控制臺(tái)打印出相應(yīng)的調(diào)用方法的名字。
小球的腳本代碼:
<code>
private Rigidbody rb;
// Use this for initialization
void Start () {
rb=GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update () {
    if (Input.GetMouseButtonDown(0))
    {
       // this.transform.Translate(new Vector3(1,0,0));//小球沒(méi)有剛體時(shí)讓其移動(dòng)的方法
        rb.AddForce(new Vector3(1, 0, 0));//小球擁有剛體時(shí)讓其移動(dòng)的方法
        //兩種方法根據(jù)情形不同選擇其中一個(gè)
    }
}
void OnCollisionEnter()
{
    print("小球調(diào)用了OnCollisionEnter方法");
}
void OnCollisionStay()
{
    print("小球調(diào)用了OnCollisionStay方法");
}
void OnCollisionExit()
{
    print("小球調(diào)用了OnCollisionExit方法");
}

</code>
方塊的腳本代碼:
<code>
// Use this for initialization
void Start () {

}

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

}
void OnCollisionEnter()
{
    print("方塊調(diào)用了OnCollisionEnter方法");
}
void OnCollisionStay()
{
    print("方塊調(diào)用了OnCollisionStay方法");
}
void OnCollisionExit()
{
    print("方塊調(diào)用了OnCollisionExit方法");
}

</code>
把寫好的腳本分別加入相應(yīng)的游戲?qū)ο笾?,然后我們就單擊運(yùn)行按鈕,查看Console視圖的打印內(nèi)容,如圖情形一:


情形一.1

圖情形一.1可以看出小球和方塊都調(diào)用了OnCollisionEnter和OnCollisionStay方法,其中OnCollisionEnter都只調(diào)用了一次(Plane自帶的有Mesh Collider),OnCollisionStay方法一直在調(diào)用;至于方法調(diào)用的先后順序是:OnCollisionEnter>OnCollisionStay>OnCollisionExit,而之所以先調(diào)用了方塊的方法是因?yàn)榉綁K先落的地。

情形一.2

有上面兩個(gè)圖我們可以得出:當(dāng)兩個(gè)游戲?qū)ο蠖紦碛袆傮w和碰撞器時(shí),他們?cè)谂鲎矔r(shí)都會(huì)打印碰撞器的三種方法。

情形二:小球有剛體和碰撞器,方塊只有碰撞器時(shí)

如圖情形二:

情形二.1
情形二.2

得出:當(dāng)兩個(gè)游戲?qū)ο笠环綋碛袆傮w和碰撞器,另一方只擁有碰撞器時(shí),只要兩方發(fā)生碰撞,就會(huì)調(diào)用碰撞方法。

情形三:小球和方塊都只有碰撞器,沒(méi)有剛體

此時(shí)小球沒(méi)有了剛體,我們讓它移動(dòng)要利用另外一種方法,上面代碼有寫,這里直接用就行了。
如圖情形三:

情形三

得出:當(dāng)兩個(gè)游戲?qū)ο笾粨碛信鲎财?,它們互相碰撞接觸時(shí)不會(huì)調(diào)用碰撞方法。

情形四:一方(小球)帶有剛體和碰撞器,另一方(方塊)只帶有剛體,沒(méi)有碰撞器。

如圖情形四:
首先我們要把方塊的碰撞器組件-Box Collider取消勾選,如圖情形四.1:

情形四.1
情形四.2

為了驗(yàn)證小球和方塊的碰撞,我們把小球放到了方塊的正下方,這樣方塊落下時(shí)就會(huì)和小球碰撞接觸了,如圖情形四.3。


情形四.3
情形四.4

得出:當(dāng)一方有剛體和碰撞器,另一方只有剛體,兩方相互碰撞接觸時(shí),都不會(huì)調(diào)用碰撞方法。

由此得出結(jié)論:

兩個(gè)物體碰撞調(diào)用碰撞方法的前提是必須兩個(gè)物體都擁有碰撞器—Collider,而且其中一方必須帶有剛體組件。

二、觸發(fā)檢測(cè)

觸發(fā)檢測(cè)就要用到觸發(fā)器,而觸發(fā)器可以說(shuō)就是一種特殊的碰撞器,因?yàn)橹灰雅鲎财鹘M件中的Is Trigger屬性勾選上,就變成了觸發(fā)器。
和碰撞檢測(cè)類似,觸發(fā)檢測(cè)也有三種方法,分別是OnTriggerEnter、OnTriggerStay、OnTriggerExit。
觸發(fā)檢測(cè)的驗(yàn)證也有很多情形,根據(jù)兩個(gè)游戲?qū)ο蟮臈l件(是否帶有剛體和觸發(fā)器)的不同大致分為:雙方都帶有剛體和觸發(fā)器、一方帶有剛體和觸發(fā)器,另一方只有剛體、一方帶有剛體和觸發(fā)器,另一方只有觸發(fā)器、雙方都只有剛體、雙方都只有觸發(fā)器。
這里就介紹一個(gè)情形下(一方帶有剛體和觸發(fā)器,另一方只有剛體)的觸發(fā)檢測(cè)方法的調(diào)用情況,其它情形自行操作。
當(dāng)選中Is Trigger后,碰撞器就變成了觸發(fā)器,如果此時(shí)我們?cè)俳o游戲?qū)ο筇砑右粋€(gè)剛體,那么游戲?qū)ο缶蜁?huì)一直墜落,因?yàn)闆](méi)有了碰撞器,所以我們要想讓游戲?qū)ο笥袆傮w而又不墜落,我們就要選中剛體組件中的Is Kinematic屬性,如圖1.5:

圖1.5

選中后,我們讓小球帶有剛體和觸發(fā)器,讓方塊只帶有剛體。此時(shí)改一下小球和方塊的代碼,把觸發(fā)檢測(cè)的三個(gè)方法寫進(jìn)去,然后我們運(yùn)行項(xiàng)目,操作小球移動(dòng),觀察打印結(jié)果,如圖1.6:

圖1.6
后面幾種情形自行實(shí)驗(yàn)過(guò)后我們就得出了一個(gè)結(jié)論:

只要有一方游戲?qū)ο髱в袆傮w和觸發(fā)器,另一方不管是否帶有剛體和觸發(fā)器,兩個(gè)游戲?qū)ο蠖紩?huì)調(diào)用觸發(fā)檢測(cè)方法。

三、碰撞檢測(cè)和觸發(fā)檢測(cè)的異同
相同點(diǎn):

1、兩種檢測(cè)的基礎(chǔ)都是Collider組件;
2、兩種檢測(cè)的三種方法類似;

不同點(diǎn):

1、碰撞檢測(cè)必須兩個(gè)Collider組件都不勾選Is Trigger,只要勾選了,就會(huì)進(jìn)入觸發(fā)檢測(cè);
2、觸發(fā)檢測(cè)和碰撞檢測(cè)有沖突,不能同時(shí)存在,只能存在一個(gè);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書人閱讀 175,506評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,614評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,402評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 54,934評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,168評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,596評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,027評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,404評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,662評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,398評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,743評(píng)論 2 370

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