Rigidbody組件里,IsKinematic對(duì)于初學(xué)者來(lái)說(shuō)是一個(gè)特別難以理解的屬性。
本文圍繞IsKinematic設(shè)定選項(xiàng)展開(kāi)一系列實(shí)驗(yàn),并對(duì)其進(jìn)行解釋說(shuō)明。
文章內(nèi)容將分為以下幾個(gè)部分:
1、測(cè)試環(huán)境 2、關(guān)于Rigidbody 3、關(guān)于IsKinematic 4、 IsKinematic的優(yōu)點(diǎn) 5、實(shí)驗(yàn) (1) 當(dāng)球體滾動(dòng)時(shí)的IsKinematic設(shè)定 (2)當(dāng)球體被拋出去時(shí)的IsKinematic設(shè)定 (3)自由落體時(shí)的情況 (4)動(dòng)態(tài)切換IsKinematic值 6、 總結(jié) 1、測(cè)試環(huán)境
macOS 10.13 High Sierra
Unity2018.1.0f2
2、關(guān)于Rigidbody
概括來(lái)說(shuō),Rigidbody是Unity開(kāi)發(fā)引擎中控制物理系統(tǒng)的必要組件。
Rigidbody參數(shù)
3、關(guān)于IsKinematic
當(dāng)我第一次看到這些設(shè)定選項(xiàng)時(shí),老實(shí)說(shuō)我并不明白其中涵義。
true和false,到底哪一個(gè)設(shè)定會(huì)受到物理系統(tǒng)的影響呢?
后來(lái)我發(fā)現(xiàn):如果為true,則不會(huì)受到物理系統(tǒng)的影響。如果為false,發(fā)生Rigidbody運(yùn)動(dòng)時(shí)則會(huì)受到物理系統(tǒng)的影響。
4、IsKinematic的優(yōu)點(diǎn)
在Unity操作手冊(cè)中,「Rigidbody概述」這一部分寫(xiě)的是「使用Rigidbody時(shí)不要更改Transform值」。
既然如此,那么,還有設(shè)定IsKinematic的必要嗎?后來(lái),在Unity操作手冊(cè)英文版里,我看到一段這樣的描寫(xiě)「如果想以一種非物理的方式進(jìn)行表現(xiàn),在這種情況下,請(qǐng)勾選IsKinematic」。
對(duì)此,我的疑問(wèn)不減反增:如果不是物理系統(tǒng)的行為,為什么還需要設(shè)定Rigidbody呢?
作為初學(xué)者的我即使這樣想,但我明白它們也有一定的好處,不但能夠在Collider中檢測(cè)碰撞,還能動(dòng)態(tài)改變IsKinematic值。
在Unity操作手冊(cè)英文版里,有個(gè)滑動(dòng)門(mén)的案例,能夠很好的說(shuō)明這個(gè)問(wèn)題。
通常,當(dāng)門(mén)關(guān)上的時(shí)候,已經(jīng)開(kāi)啟碰撞體的角色會(huì)被擋在門(mén)外。
當(dāng)角色開(kāi)門(mén)的時(shí)候,通過(guò)設(shè)定腳本將門(mén)滑動(dòng)到指定位置,角色即可順利通過(guò)。相反,如果對(duì)物理系統(tǒng)行為設(shè)置不當(dāng)?shù)脑?,有時(shí)候門(mén)會(huì)被吹飛,再恢復(fù)到原來(lái)的位置則相對(duì)不那么容易。
另外,開(kāi)門(mén)和關(guān)門(mén)的時(shí)候,只需切換IsKinematic狀態(tài)。例如開(kāi)門(mén)時(shí),IsKinematic會(huì)控制位置,但如果用武器攻打門(mén)的話,因?yàn)镽igidbody設(shè)定的緣故,門(mén)可能會(huì)被打飛。
鑒于這些問(wèn)題,與其用Rigidbody處理門(mén)的問(wèn)題,不如直接控制人物。
下面我將進(jìn)行一些實(shí)驗(yàn)來(lái)展示修改IsKinematic屬性值所產(chǎn)生的不同。
5、實(shí)驗(yàn)
(1)當(dāng)球體滾動(dòng)時(shí)的IsKinematic
現(xiàn)在,改變數(shù)值,我們觀察一下運(yùn)動(dòng)發(fā)生的狀態(tài)。
開(kāi)始擲球。
準(zhǔn)備的球有兩種不同的isKinematic值,如下:
isKinematic : true
isKinematic : false
同時(shí)對(duì)兩個(gè)球施加力的時(shí)候,觀察一下運(yùn)動(dòng)狀態(tài)。
當(dāng)ForceMode為Impulse時(shí),下圖的左上角數(shù)值表示施加力的大小。
兩種不同IsKinematic值的球的滾動(dòng)情況
因?yàn)樗皇芪锢硐到y(tǒng)的影響,如果IsKinematic為ture時(shí),根本不起作用。
(2)當(dāng)球體被拋出去時(shí)的IsKinematic
證實(shí)一下球體被拋出去的狀態(tài)。
兩種不同IsKinematic值的球的被拋出去情況
和滾動(dòng)的一樣,當(dāng)IsKinematic為ture時(shí),就算用AddForce,白球也不會(huì)動(dòng)。
(3)自由落體的情況
雖然結(jié)果已經(jīng)顯而易見(jiàn)了,但仍確認(rèn)一下自由落體時(shí)的情況。
兩種不同IsKinematic值的球的自由落體情況
當(dāng)IsKinematic為ture時(shí),不受重力的影響。
以左邊物體的Rigidbody為例,當(dāng)UseGravity為true時(shí),IsKinematic具有優(yōu)先性。
所以,動(dòng)態(tài)切換IsKinematic的時(shí)候,別忘了取消勾選UseGravity。
(4)動(dòng)態(tài)改變IsKinematic值
以動(dòng)態(tài)切換IsKinematic為例,實(shí)現(xiàn)以下功能:擊中球1秒后,通過(guò)腳本來(lái)改變運(yùn)動(dòng)。
有了Rigidbody,當(dāng)IsKinematic為false時(shí)發(fā)生碰撞。由于Mass的差異,球飛出去的方式也有所不同。
球的反擊
粉紅色的球從屏幕右側(cè)滾出,一秒鐘后,白球和黃球?qū)sKinematic自動(dòng)設(shè)置為true,并開(kāi)始往復(fù)運(yùn)動(dòng)。該狀態(tài)可直接在腳本的Transform中進(jìn)行設(shè)置。
從上圖可以看到,畫(huà)面前方的粉紅色球被質(zhì)量較大的黃球碰撞,向相反方向滾動(dòng),并越過(guò)往復(fù)運(yùn)動(dòng)范圍。后側(cè)粉紅色的球被擊中多次,但其被白球碰撞后并沒(méi)有滾動(dòng)到圖片最右邊。
下一步借助Cube來(lái)進(jìn)行碰撞。
Cube的反擊
可以發(fā)現(xiàn),有了IsKinematic之后,為粉紅色的球提供了一個(gè)力。
由此延伸至游戲開(kāi)發(fā)實(shí)操中,Cube可以作為地牢里的移動(dòng)壁壘裝置,用于將設(shè)定的角色打落到地下室底部。
同時(shí)需要注意的是,在體積上,移動(dòng)壁壘最好比角色大一些。如「球的反擊」一圖所示,如果碰撞的球大小相同,Rigidbody則會(huì)出現(xiàn)如圖所示的奇怪現(xiàn)象。
多數(shù)情況下,通過(guò)腳本來(lái)控制對(duì)象的移動(dòng),或許也是不錯(cuò)的選擇。
6、總結(jié)
Rigidbody的IsKinematic使用方法,對(duì)初學(xué)者來(lái)說(shuō)的確有些難以理解。
一開(kāi)始可能很難使用,但借助腳本來(lái)控制對(duì)象的移動(dòng),總體上來(lái)說(shuō)還是很簡(jiǎn)便的。
希望本文的介紹對(duì)你有所幫助。