碰撞器檢測(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閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传透,死亡現(xiàn)場(chǎng)離奇詭異耘沼,居然都是意外死亡极颓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門群嗤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)菠隆,“玉大人,你說(shuō)我怎么就攤上這事『Ь叮” “怎么了躯肌?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)破衔。 經(jīng)常有香客問(wèn)我清女,道長(zhǎng),這世上最難降的妖魔是什么晰筛? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任嫡丙,我火速辦了婚禮,結(jié)果婚禮上读第,老公的妹妹穿的比我還像新娘曙博。我一直安慰自己,他們只是感情好怜瞒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布父泳。 她就那樣靜靜地躺著,像睡著了一般吴汪。 火紅的嫁衣襯著肌膚如雪惠窄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天浇坐,我揣著相機(jī)與錄音睬捶,去河邊找鬼。 笑死近刘,一個(gè)胖子當(dāng)著我的面吹牛擒贸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觉渴,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼介劫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了案淋?” 一聲冷哼從身側(cè)響起座韵,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踢京,沒(méi)想到半個(gè)月后誉碴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓣距,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年黔帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹈丸。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡成黄,死狀恐怖呐芥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奋岁,我是刑警寧澤思瘟,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站闻伶,受9級(jí)特大地震影響滨攻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓝翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一铡买、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎箍,春花似錦奇钞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顶别,卻和暖如春谷徙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驯绎。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工完慧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩失。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓屈尼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拴孤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脾歧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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