1.Rigidbody overview
剛體是可以讓一個GameObject(以下簡稱游戲?qū)ο螅┍憩F(xiàn)出物理行為的主要組件,附加到游戲?qū)ο笊现罂梢粤ⅠR給這個游戲?qū)ο笫┘右粋€重力。如果給這個游戲?qū)ο笊显黾恿艘粋€或者多個Collider組件的話,這個游戲?qū)ο罂梢酝ㄟ^其他的碰撞進(jìn)行移動。
由于Rigidbody組件接管了游戲?qū)ο蟮倪\動,所以不應(yīng)該試圖在腳本里通過修改Transform組件里面的類似于position和rotation的屬性來讓游戲?qū)ο笠苿樱菓?yīng)該通過施加改變forces(力)然后讓物理引擎去計算游戲?qū)ο蟮囊苿咏Y(jié)果。
在某些情況下,你可能會想要一個帶剛體的游戲物體,但是這個游戲物體的移動不受物理引擎的控制。例如:你有時會想通過腳本代碼控制你的角色方向,但是你的角色仍然可以被觸發(fā)器檢測到,這種由腳本產(chǎn)生的非物理移動被稱為動力學(xué)運動。Rigidbody組件有個叫做IsKinematic 的屬性,它將其從物理引擎的控制中移除,并且允許它從腳本中的運動學(xué)移動。對象的物理性質(zhì)的開關(guān)可以通過腳本中的IsKinematic來改變,但這可能帶來性能開銷的增加,所以應(yīng)該謹(jǐn)慎使用。
當(dāng)一個剛體移動速度比定義好的minimum線性或者旋轉(zhuǎn)速度,物理引擎假設(shè)這個對象已經(jīng)停止,這時候這個游戲?qū)ο蟛豢梢砸苿又钡剿邮芰艘粋€力或者碰撞,并且同時設(shè)置了休眠模式。這個優(yōu)化意味著處理器在這個游戲?qū)ο蟊辉俅螁拘阎安恍枰ㄙM時間去處理更新。
大多數(shù)情況下,Rigidbody組件的喚醒和休眠的發(fā)生是透明的。然而如果通過修改組件的位置將靜態(tài)對撞機(jī)移入其中或者遠(yuǎn)離它,則GameObject無法被喚醒。換一種說法就是當(dāng)一個物體從下面移出(或者剛體組件從上面移出),會導(dǎo)致剛體對象懸掛在空中。在這種情況下可以通過使用WakeUp去顯式的喚醒這個對象。獲取更多關(guān)于Rigidbody和Rigidbody的信息
2.Colliders
Collider組件定義的物體的形狀用于物理碰撞。一個不可見的碰撞器的形狀不需要完全和對象的網(wǎng)格相同,事實上粗略的近似更加逼真而且在游戲中難以區(qū)分。
最簡單的碰撞機(jī)(和處理器的密集程度)也是最原始的碰撞機(jī)。比如在3D中的Box Collider,Sphere Collider和Capsule Collider;在2D中的Box Collider 2D和Circle Collider 2D??梢詫⑷我獾呐鲎矙C(jī)添加到同一個對象上面以創(chuàng)建復(fù)合碰撞機(jī)。
通過調(diào)整復(fù)合碰撞機(jī)的位置和尺寸,可以很好的接近對象的形狀,同時保持處理器的開銷。通過在子物體上增加碰撞機(jī),可以進(jìn)一步的獲得靈活性(例如相對于父對象的局部旋轉(zhuǎn)框)。創(chuàng)建這樣的復(fù)合碰撞機(jī)的時候,應(yīng)該有且只有一個Rigibody組件被添加到根物體上面。
原始對撞機(jī)無法在裁剪變換中正常工作-意味著如果在變換層次結(jié)構(gòu)中使用旋轉(zhuǎn)和非均勻縮放的組合會導(dǎo)致生成的形狀不再和原始形狀相匹配,原始碰撞機(jī)也就不會正確的表現(xiàn)(個人理解:在視覺上感覺不對勁)
在某些情況下,復(fù)合碰撞機(jī)也會表現(xiàn)得不準(zhǔn)確。在3D中可以使用Mesh Collider去精確得匹配對象的網(wǎng)格形狀。在2D中,Polygon Collider通常和精靈圖形的形狀精確的匹配,但可以重新調(diào)整碰撞機(jī)的形狀以達(dá)到你喜歡的任何細(xì)節(jié)等級。以上的碰撞機(jī)消耗的處理器性能比原始碰撞機(jī)更高,因此需要謹(jǐn)慎的使用它們以保持良好的性能。另外網(wǎng)格碰撞體通常不會和其他的網(wǎng)格碰撞體發(fā)生碰撞(即,當(dāng)他們接觸時無法發(fā)生任何事情)。在某些情況下,你可以在Inspector中將網(wǎng)格碰撞機(jī)標(biāo)記為“Convex”來解決這個問題。這將產(chǎn)生像“凸包”形狀的碰撞機(jī),其類似于原始網(wǎng)格,但填充了一些“undercuts ”。這樣做的好處是凸網(wǎng)格對撞機(jī)可以與其他網(wǎng)格對撞機(jī)碰撞,因此您可以當(dāng)你有一個具有合適形狀的移動角色時使用此功能。然而,一個更好的一般規(guī)則是使用網(wǎng)格碰撞器用于,并使用復(fù)合原始碰撞器近似移動對象的形狀。
可以將碰撞器添加到?jīng)]有Rigidbody組件的對象中,以創(chuàng)建場景的地板,墻壁和其他靜止元素。這些被稱為靜態(tài)對撞機(jī)。通常,您不應(yīng)通過更改“Transform”的位置來重新定位靜態(tài)對撞機(jī),因為這會嚴(yán)重影響物理引擎的性能。具有剛體的物體上的碰撞器被稱為動態(tài)碰撞器。靜態(tài)碰撞器可以與動態(tài)碰撞器相互作用,但由于它們沒有剛體,因此它們不會響應(yīng)碰撞而移動。
3.Physics materials
當(dāng)碰撞者相互作用時,他們的表面需要模擬他們應(yīng)該代表的材料的屬性。例如,一塊冰將是光滑的,而橡膠球?qū)⑻峁┐罅康哪Σ敛⑶曳浅S袕椥?。雖然碰撞時碰撞器的形狀不會變形,但可以使用物理材料配置它們的摩擦和彈跳。獲得恰到好處的參數(shù)可能涉及一些試驗和錯誤,但冰材料,例如將具有零(或非常低)的摩擦和具有高摩擦和近乎完美的彈性的橡膠材料。有關(guān)可用參數(shù)的更多詳細(xì)信息,請參見物理材料和物理材料2D的參考頁面。請注意,由于歷史原因,3D資源實際上稱為物理材質(zhì)(沒有S),但2D等效物稱為物理材質(zhì)2D(帶有S)
4.Triggers
腳本可以檢測何時發(fā)生碰撞并觸發(fā)OnCollisionEnter函數(shù)。 但是,您也可以簡單地使用物理引擎檢測一個碰撞器何時進(jìn)入另一個碰撞器的空間而不會產(chǎn)生碰撞。 配置為觸發(fā)器的對撞機(jī)(使用Is Trigger屬性)不會表現(xiàn)為實體對象,只會允許其他對撞機(jī)通過。 當(dāng)對撞機(jī)進(jìn)入其空間時,觸發(fā)器將調(diào)用觸發(fā)器對象腳本上的OnTriggerEnter函數(shù)。
5.Script actions taken on collision
發(fā)生碰撞時,物理引擎會在附加到所涉及對象的任何腳本上調(diào)用具有特定名稱的函數(shù)。您可以在這些函數(shù)中放置您喜歡的任何代碼來響應(yīng)碰撞事件。例如,當(dāng)汽車撞到障礙物時,您可能會發(fā)揮碰撞聲音效果。
在檢測到?jīng)_突的第一個物理更新中,調(diào)用OnCollisionEnter函數(shù)。在兩個物體的碰撞器未分離的時候,調(diào)用OnCollisionStay;OnCollisionExit表示兩個物體的碰撞器已經(jīng)分離。觸發(fā)器碰撞器調(diào)用類似的OnTriggerEnter,OnTriggerStay和OnTriggerExit函數(shù)。請注意,對于2D物理,有名稱附加了2D的等效函數(shù),例如OnCollisionEnter2D。對于正常的非觸發(fā)碰撞,還有一個額外的細(xì)節(jié),即所涉及的對象中至少有一個必須具有非運動剛體(即,必須關(guān)閉運動學(xué))。如果兩個對象都是運動學(xué)的剛體,則不會調(diào)用OnCollisionEnter等。對于觸發(fā)器碰撞,此限制不適用,因此運動和非運動剛體都會在進(jìn)入觸發(fā)器對撞機(jī)時提示調(diào)用OnTriggerEnter。
6.Collider interactions
碰撞器彼此之間的交互方式具體取決于Rigidbody組件的配置方式。 三個重要配置是靜態(tài)對撞機(jī)(即根本沒有連接剛體),剛體碰撞器和運動剛體碰撞器。
(1)Static Collider
這是一個具有Collider但沒有Rigidbody的GameObject。靜態(tài)對撞機(jī)用于 level geometry ,它總是停留在同一個地方,永遠(yuǎn)不會四處移動。傳入的剛體對象將與靜態(tài)對撞機(jī)發(fā)生碰撞,但不會移動它。
物理引擎假定靜態(tài)對撞機(jī)永遠(yuǎn)不會移動或改變,并且可以基于此假設(shè)進(jìn)行有用的優(yōu)化。因此,在游戲過程中不應(yīng)對靜態(tài)對撞機(jī)設(shè)置disabled/enabled,移動或縮放。如果您確實更改了靜態(tài)對撞機(jī),那么這將導(dǎo)致物理引擎進(jìn)行額外的內(nèi)部重新計算,從而導(dǎo)致性能大幅下降。更糟糕的是,這些變化有時會使對撞機(jī)處于未定義狀態(tài),從而產(chǎn)生錯誤的物理計算。例如,針對改變的靜態(tài)對撞機(jī)的光線投射可能無法檢測到它,或者在空間中的隨機(jī)位置檢測到它。此外,被移動的靜態(tài)對撞機(jī)擊中的剛體不一定會“被喚醒”,靜態(tài)對撞機(jī)也不會施加任何摩擦力。由于這些原因,只應(yīng)改變作為剛體的碰撞器。如果您想要一個不受傳入剛體影響但仍然可以從腳本移動的對撞機(jī)對象,那么您應(yīng)該將一個Kinematic Rigidbody組件附加到它而不是根本沒有Rigidbody。
(2)Rigidbody Collider
這是一個帶有碰撞器的游戲?qū)ο螅綆б粋€普通的非運動剛體。 剛體碰撞器由物理引擎完全模擬,可以對腳本施加的碰撞和力作出反應(yīng)。 它們可以與其他物體(包括靜態(tài)對撞機(jī))發(fā)生碰撞,是使用物理學(xué)的游戲中最常用的對撞機(jī)配置。
(3)Kinematic Rigidbody Collider(運動學(xué)剛體)
這是一個帶有Collider和附加運動剛體的GameObject(即,啟用了Rigidbody的IsKinematic屬性)。您可以通過修改其Transform組件來從腳本中移動Kinematic Rigidbody對象,但它不會像非運動剛體那樣響應(yīng)碰撞和力。Kinematic Rigidbody應(yīng)該用于可以偶爾移動或disabled/enabled 的碰撞器,否則它們應(yīng)該像靜態(tài)碰撞器一樣運行。這方面的一個例子是滑動門,它通常應(yīng)該作為一個不可移動的物理障礙物,但必要時可以打開。與靜態(tài)對撞機(jī)不同,移動的運動剛體會對其他物體施加摩擦力,并在接觸時“喚醒”其他剛體。
即使是不動的,運動剛體碰撞器也會對靜態(tài)碰撞器產(chǎn)生不同的行為。例如,如果將對撞機(jī)設(shè)置為觸發(fā)器,則還需要向其添加剛體以便在腳本中接收觸發(fā)事件。如果您不希望觸發(fā)器在重力作用下或受物理影響,那么您可以在其剛體上設(shè)置IsKinematic屬性。
可以使用IsKinematic屬性隨時在正常和運動行為之間切換剛體組件。
一個常見的例子是“ragdoll”效果,其中角色通常在動畫下移動,但是在爆炸或重碰撞時被物理拋出。 每個角色的肢體都可以被賦予自己的Rigidbody組件,默認(rèn)情況下啟用IsKinematic。 四肢將通過動畫進(jìn)行正常移動,直到所有這些肢體都關(guān)閉IsKinematic并且它們立即表現(xiàn)為物理對象。 在這一點上,碰撞或爆炸力將使角色飛行,其四肢以令人信服的方式投擲。
7.Collision action matrix
當(dāng)兩個對象發(fā)生碰撞時,可能會發(fā)生許多不同的腳本事件,具體取決于碰撞對象的剛體的配置。下面的圖表提供了基于附加到對象的組件調(diào)用哪些事件函數(shù)的詳細(xì)信息。某些組合僅導(dǎo)致兩個對象中的一個受到碰撞的影響,但一般規(guī)則是物理將不會應(yīng)用于未附加Rigidbody組件的對象。
