改變Rigidbody組件中IsKinematic屬性的實驗

來源:Unity官方平臺
作者:日本網(wǎng)友
時間:2020-01-13
5546
本文由日本一位Unity資深技術(shù)專家寫作,旨在幫助Unity初學(xué)者快速學(xué)習(xí)Unity相關(guān)技術(shù)。

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)的必要組件。

1.jpg

Rigidbody參數(shù) 

3、關(guān)于IsKinematic

2.jpg

當(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操作手冊英文版里,有個滑動門的案例,能夠很好的說明這個問題。

3.jpg

通常,當(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ù)值表示施加力的大小。

4.gif

兩種不同IsKinematic值的球的滾動情況

因為它不受物理系統(tǒng)的影響,如果IsKinematic為ture時,根本不起作用。

(2)當(dāng)球體被拋出去時的IsKinematic

證實一下球體被拋出去的狀態(tài)。

5.gif

兩種不同IsKinematic值的球的被拋出去情況

和滾動的一樣,當(dāng)IsKinematic為ture時,就算用AddForce,白球也不會動。

(3)自由落體的情況

雖然結(jié)果已經(jīng)顯而易見了,但仍確認一下自由落體時的情況。

6.gif

兩種不同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的差異,球飛出去的方式也有所不同。

7.gif

球的反擊

粉紅色的球從屏幕右側(cè)滾出,一秒鐘后,白球和黃球?qū)sKinematic自動設(shè)置為true,并開始往復(fù)運動。該狀態(tài)可直接在腳本的Transform中進行設(shè)置。

從上圖可以看到,畫面前方的粉紅色球被質(zhì)量較大的黃球碰撞,向相反方向滾動,并越過往復(fù)運動范圍。后側(cè)粉紅色的球被擊中多次,但其被白球碰撞后并沒有滾動到圖片最右邊。

下一步借助Cube來進行碰撞。

8.gif

 Cube的反擊

可以發(fā)現(xiàn),有了IsKinematic之后,為粉紅色的球提供了一個力。

由此延伸至游戲開發(fā)實操中,Cube可以作為地牢里的移動壁壘裝置,用于將設(shè)定的角色打落到地下室底部。 

同時需要注意的是,在體積上,移動壁壘最好比角色大一些。如「球的反擊」一圖所示,如果碰撞的球大小相同,Rigidbody則會出現(xiàn)如圖所示的奇怪現(xiàn)象。

多數(shù)情況下,通過腳本來控制對象的移動,或許也是不錯的選擇。 

6、總結(jié)

Rigidbody的IsKinematic使用方法,對初學(xué)者來說的確有些難以理解。

一開始可能很難使用,但借助腳本來控制對象的移動,總體上來說還是很簡便的。

希望本文的介紹對你有所幫助。

立即登錄,閱讀全文
原文鏈接:點擊前往 >
文章來源:Unity官方平臺
版權(quán)說明:本文內(nèi)容來自于Unity官方平臺,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
掃碼關(guān)注
獲取更多出海資訊的相關(guān)信息
優(yōu)質(zhì)服務(wù)商推薦
更多