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