在游戲世界中,游戲物體之間的交互都是通過(guò)“碰撞接觸”來(lái)進(jìn)行交互的。例如,攻擊怪物則是主角與怪物的碰撞,觸發(fā)機(jī)關(guān)則是主角與機(jī)關(guān)的碰撞。在DirectX課程中,我們也大致介紹過(guò)有關(guān)碰撞檢測(cè)的內(nèi)容。游戲世界中的3D模型的形狀是非常復(fù)雜的,我們不可能按照模型的原始形狀進(jìn)行兩者之間的碰撞檢測(cè),而是將模型看做近似的立方體或者球體來(lái)進(jìn)行碰撞檢測(cè),雖然這種形式的檢測(cè)精度不是很高,但是對(duì)于一般的游戲體驗(yàn)來(lái)講,已經(jīng)足夠了。
在Unity中碰撞體分為:盒型碰撞體、球形碰撞體和膠囊碰撞體,還有一個(gè)網(wǎng)格碰撞體。當(dāng)然,我們還可以將任意數(shù)量的上述碰撞體添加到單個(gè)游戲?qū)ο笠詣?chuàng)建復(fù)合碰撞體。復(fù)合碰撞體可以更加貼近的模擬游戲?qū)ο蟮男螤?,同時(shí)保持較低的性能開(kāi)銷。復(fù)合碰撞體一般用于父子化的游戲?qū)ο?,并且根游戲?qū)ο笊蠎?yīng)該只使用一個(gè)剛體組件。在某些情況下,如果復(fù)合碰撞體也不夠準(zhǔn)確。我們才可以使用網(wǎng)格碰撞體精確匹配游戲?qū)ο缶W(wǎng)格的形狀。網(wǎng)格碰撞體需要更高的性能開(kāi)銷,因此請(qǐng)盡量不要在游戲中大量使用。此外,網(wǎng)格碰撞體之間無(wú)法進(jìn)行碰撞檢測(cè),只能是簡(jiǎn)單的盒型或球形碰撞體與網(wǎng)格碰撞體進(jìn)行碰撞檢測(cè)。
接下來(lái),我們創(chuàng)建一個(gè)新的場(chǎng)景“SampleScene2.unity”來(lái)演示碰撞體的使用。
我們?cè)谝粋€(gè)平面上面添加兩個(gè)球體,默認(rèn)情況下,創(chuàng)建的球體會(huì)自動(dòng)添加球形碰撞體。
?
如上圖所示中的“Sphere Collider”球形碰撞組件,為了能夠讓我們左邊的黃色球體Sphere2產(chǎn)生運(yùn)動(dòng),我們需要添加一個(gè)剛體,如下所示:
此時(shí),我們的黃色球體Sphere2同時(shí)具備了碰撞體和剛體兩個(gè)組件。接下來(lái),我們給黃色球體施加一個(gè)力,讓其能夠向右運(yùn)動(dòng)去撞擊紫色的球體Sphere1。
我們?cè)黾恿艘粋€(gè)X軸方向的數(shù)值為2的力。接下來(lái),我們就運(yùn)行這個(gè)工程來(lái)查看效果:
我們發(fā)現(xiàn),當(dāng)黃色球體接觸到紫色球體的時(shí)候,就靜止不動(dòng)了。我們暫時(shí)不解釋這個(gè)結(jié)果。我們上面提到過(guò),球體是自動(dòng)添加球形碰撞體的,也就是說(shuō),我們的紫色球體上面有一個(gè)球形碰撞體(沒(méi)有剛體)。我們?nèi)∠仙蝮w上面的球形碰撞體,在重新運(yùn)行這個(gè)工程。
?
我們發(fā)現(xiàn),黃色球體會(huì)穿過(guò)紫色球體繼續(xù)向右運(yùn)動(dòng)下去。從紫色球體的表現(xiàn),我們可以看出碰撞體組件最明顯的表現(xiàn)就是不會(huì)讓對(duì)方游戲?qū)ο蟠┩福ㄒ步写┠#?/span>。接下來(lái),我們將黃色球體的碰撞體組件也取消掉(同時(shí)取消剛體Use Gravity屬性,防止重力影響掉落平面以下),也就是說(shuō)兩個(gè)球體都沒(méi)有碰撞體組件了。如果我們?cè)俅芜\(yùn)行工程的話,就會(huì)發(fā)現(xiàn)黃球依然穿透紫球。那么,我們恢復(fù)紫球的碰撞體組件呢?我們?cè)俅芜\(yùn)行工程,就會(huì)發(fā)現(xiàn)黃色再次穿透紫球了。最后的結(jié)論就是,兩者都具備碰撞體組件的時(shí)候,才會(huì)發(fā)生碰撞檢測(cè)。這個(gè)道理非常簡(jiǎn)單,熟悉我們DirectX課程的應(yīng)該知道,碰撞檢測(cè)的本質(zhì)就是兩個(gè)碰撞模型進(jìn)行相互包含計(jì)算,因此碰撞雙方都必須具備碰撞體,否則沒(méi)辦法進(jìn)行檢測(cè)計(jì)算。
接下來(lái),我們就來(lái)介紹一些碰撞體組件的參數(shù)。
首先是Edit Collider按鈕,點(diǎn)擊這個(gè)按鈕,可以讓我們可視化的調(diào)整碰撞體的尺寸。
點(diǎn)擊線框連接點(diǎn),拖動(dòng)就可以修改碰撞體的大小,同時(shí)在Inspector檢視面板中看到
上圖中的中心點(diǎn)的Y值和半徑Radius值就隨之改變了。對(duì)于圓形來(lái)講,只需要圓心和半徑就能確定它的大小了。這一點(diǎn)應(yīng)該很容易理解。當(dāng)然我們還可以通知修改數(shù)值改變大小。
Is Trigger是一個(gè)觸發(fā)選項(xiàng),后面我們會(huì)詳細(xì)介紹它。
Material代表物理材質(zhì)。當(dāng)碰撞體相互作用時(shí),它們的表面需要模擬所應(yīng)代表的材質(zhì)的屬性。例如,一塊冰將是光滑的,而橡膠球?qū)⑻峁┐罅磕Σ亮Σ⑶覐椥院芎谩km然碰撞時(shí)碰撞體的形狀不會(huì)變形,但可以使用 Physics Materials(物理材質(zhì))配置碰撞體的摩擦力和彈力。
Center就是碰撞體的中心,默認(rèn)X/Y/Z都是0,等效于于局部坐標(biāo)系原點(diǎn)。
Radius是圓形碰撞體的半徑大小,默認(rèn)值是0.5。
如果是盒型碰撞體的話,這里應(yīng)該是Size屬性,其X/Y/Z代表盒性的長(zhǎng)寬高。
如果是膠囊碰撞體的話,這里應(yīng)該是Radius和Height,以及Direction三個(gè)屬性。其中Radius代表膠囊體的半徑,Height代表膠囊體的高度,而Direction則是局部空間中縱向方向的軸,默認(rèn)是Y軸。膠囊體通常用來(lái)模擬“人形”形狀進(jìn)行碰撞檢測(cè),因此多用于人物角色上。
我們使用碰撞體的時(shí)候,最重要的注意點(diǎn)就是,讓碰撞體的尺寸能夠恰當(dāng)?shù)陌∥覀兊哪P?。因?yàn)槲覀兪窃赨nity上創(chuàng)建的球體,而Unity會(huì)根據(jù)球體的尺寸自動(dòng)匹配添加球型碰撞體。因此,球體模型和球型碰撞體的尺寸是非常吻合的。但是,如果是我們自己手動(dòng)導(dǎo)入的FBX格式的3D模型,Unity就不能保證碰撞體能夠恰當(dāng)?shù)陌?D模型了。碰撞體能夠恰當(dāng)?shù)陌?D模型非常的重要,這個(gè)將直接決定我們游戲中模型之間的碰撞檢測(cè),因?yàn)榕鲎搀w是不可見(jiàn)的,我們只能通過(guò)模型與模型的距離來(lái)檢查是否發(fā)生碰撞。但是我們自己都很明白,模型與模型的距離并不代表碰撞體與碰撞體之間的距離。如果模型與碰撞體不能恰當(dāng)?shù)陌?,那么我們可能在視覺(jué)上產(chǎn)生很大的差異,影響游戲體驗(yàn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-445042.html
本課程涉及的內(nèi)容已經(jīng)共享到百度網(wǎng)盤:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-445042.html
到了這里,關(guān)于第二十六章 Unity碰撞體Collision(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!