• 您的位置:首頁 > 新聞動態(tài) > Unity3D

    Unity3D Rigidbody詳解

    2018/3/5??????點(diǎn)擊:

    剛體能讓你的游戲?qū)ο蟊晃锢硪嫠刂?,它能通過受到推力和扭力來實(shí)現(xiàn)真實(shí)的物理表現(xiàn)效果。所有游戲?qū)ο蟊仨毎瑒傮w組件來實(shí)現(xiàn)重力、通過腳本施加力、或者與其他對象進(jìn)行交互,這一切都通過NVIDIA的PhysX物理引擎來實(shí)現(xiàn)。

    屬性

    Mass 質(zhì)量,單位為Kg,建議不要讓對象之間的質(zhì)量差達(dá)到100倍以上

    Drag 空氣阻力,為0表示沒有阻力,infinity表示立即停止移動

    Angular Drag 扭力的阻力,數(shù)值意義同上

    Use Gravity 是否受重力影響

    Is Kinematic 是否為Kinematic剛體,如果啟用該參數(shù),則對象不會被物理所控制,只能通過直接設(shè)置位置、旋轉(zhuǎn)和縮放來操作它,一般用來實(shí)現(xiàn)移動平臺,或者帶有HingeJoint的動畫剛體

    Interpolate 如果你的剛體運(yùn)動時有抖動,嘗試一下修改這個參數(shù),None表示沒有插值,Interpolate表示根據(jù)上一楨的位置來做平滑插值,Extrapolate表示根據(jù)預(yù)測的下一楨的位置來做平滑插值

    Freeze Rotation 如果選中了該選項(xiàng),那么剛體將不會因?yàn)橥饬蛘吲ちΧl(fā)生旋轉(zhuǎn),你只能通過腳本的旋轉(zhuǎn)函數(shù)來進(jìn)行操作

    Collision Detection 碰撞檢測算法,用于防止剛體因快速移動而穿過其他對象

    Constraints 剛體運(yùn)動的約束,包括位置約束和旋轉(zhuǎn)約束,勾選表示在該坐標(biāo)上不允許進(jìn)行此類操作

    詳細(xì)描述

    剛體讓你的游戲?qū)ο筇幱谖锢硪娴目刂浦?,這打開了實(shí)現(xiàn)真實(shí)碰撞,各種連接類型,以及其他各種效果的大門。通過給剛體施加外力來移動它,與以前的通過設(shè)置其位置變換來移動它有比較大的不同。通常情況下,你不會同時操作剛體和變換,你只會使用其中之一。

    這兩者之間*大的差異在于力(Forces)的使用,剛體能接受推力和扭力,變換不可以。變換同樣可以實(shí)現(xiàn)位置變化與旋轉(zhuǎn),但這與通過物理引擎來實(shí)現(xiàn)是不一樣的。給剛體施加力來移動他的時候同時也會影響對象的變換數(shù)值,這也是為什么只能使用這兩者之一的原因,如果同時直接操作了剛體的變換,那么在執(zhí)行碰撞和其他操作的時候會出問題。

    你必須顯示的將剛體組件添加到你的游戲?qū)ο笊?,通過菜單項(xiàng) Component -> Physics -> Rigidbody即可添加,之后對象就處于物理引擎控制之下了,他會受到重力的影響而下落,也能夠通過腳本來受力,不過你可能還需要添加一個Collider或者Joint來讓他表現(xiàn)的更像你所期望的。

    Parenting

    當(dāng)一個對象處于物理引擎控制之下,他的運(yùn)動將會與其父對象的移動半獨(dú)立開。如果你移動任意的父對象,他們將會拉動剛體子對象,然而,剛體在重力及碰撞影響下還會下落。

    Scripting

    控制剛體的方法主要是通過腳本來施加推力和扭力,通過在剛體對象上調(diào)用AddForce()和AddTorque()方法。再次注意,當(dāng)你使用物理引擎來控制剛體的時候,不要直接操作對象的變換數(shù)值。

    Animation

    在某些時候,主要是創(chuàng)建紙娃娃效果的時候,你可能需要在動畫與物理控制之間進(jìn)行切換。你可以將剛體設(shè)置為IsKinematic,當(dāng)設(shè)置為Kinematic模式,它將不再受到外力影響。這時你只能通過變換方式來操作對象,但是Kinematic剛體還會影響其他剛體,但他自己不會再受物理引擎控制。比如,連在Kinematic剛體上的Joints還會繼續(xù)影響連接的另一個非Kinematic剛體,同時也能夠給其他剛體產(chǎn)生碰撞力。

    Colliders

    碰撞體是另一類必須手動添加的的組件,用來讓對象能夠發(fā)生碰撞。當(dāng)兩個剛體接觸到一起的時候,除非兩個剛體都設(shè)置了碰撞屬性,否則物理引擎是不會計(jì)算他們的碰撞的。沒有碰撞體的剛體在進(jìn)行物理模擬的時候?qū)唵蔚拇┻^其他剛體。

    Composed Colliders

    由多個基本的碰撞體對象組合而成,扮演一個獨(dú)立的碰撞體對象。當(dāng)你有一個復(fù)雜的模型,而你又不能使用Mesh Collider的時候就可以使用組合碰撞體。

    Continuous Collision Detection

    CCD用來防止快速移動的物體穿過其他對象。

    當(dāng)使用默認(rèn)的離散式碰撞檢測時,如果前一楨時對象在墻這一面,下一楨時對象已到到了墻另一面,那么碰撞檢測算法將檢測不到碰撞的發(fā)生,你可以將該對象的碰撞檢測屬性設(shè)置為Continuous,這時碰撞檢測算法將會防止對象穿過所有的靜態(tài)碰撞體,設(shè)置為Continuous Dynamic將還會防止穿過其他也設(shè)置為Continuous或者Continuous Dynamic的剛體。

    CCD只支持Box,Sphere和Capsule的碰撞體。

    Use The Right Size

    當(dāng)使用物理引擎的時候,游戲?qū)ο蟮拇笮”葎傮w的質(zhì)量更重要。如果你發(fā)現(xiàn)剛體的行為不是你所期望的,比如移動的太慢,漂浮,或者不能正確的進(jìn)行碰撞,嘗試一下修改你的模型的縮放值。Unity的默認(rèn)單位是1 unit = 1 米,物理引擎的計(jì)算也是按照這個單位來的。比如,一個摩天大樓的倒塌與一個由積木搭成的玩具房子的倒塌是完全不一樣的,所以,不同大小的對象在建模時都應(yīng)該按照統(tǒng)一的比例。

    對于一個人類角色模型來說,他應(yīng)該有2米高??梢詣?chuàng)建一個Box來作為參照物,默認(rèn)的Box為1米,所以一個角色應(yīng)該是Box的兩倍高。

    當(dāng)然,你也可以通過修改導(dǎo)入模型的縮放來調(diào)整比例,如果你不能直接修改模型本身的話。在Project面板中選中模型,調(diào)整其Importer屬性,注意不是變換里的縮放。

    如果你的游戲需要你實(shí)例化具有不同縮放值的對象,你也可以調(diào)整變換里的縮放值,但是物理引擎來創(chuàng)建這個對象的時候會額外多做一點(diǎn)工作,這可能會引起一點(diǎn)性能問題。

    這個問題不會太嚴(yán)重,但性能顯然會比上面兩種方法低。

    同樣要注意的是,non-uniform scales也會引起一些問題,如果這個對象具有父對象的話。基于以上原因,盡可能的在制作模型的時候就按照Unity的比例來建模。

    Hints

    兩個剛體的相對質(zhì)量決定他們在碰撞的時候?qū)绾畏磻?yīng)。

    給剛體設(shè)置更大的質(zhì)量并不會讓它下降的更快,如果要實(shí)現(xiàn)這個目的,使用Drag參數(shù)。

    低的阻力值使得對象看起來更重,高的阻力值使對象看起來更輕。

    典型的Drag值介于0.001(固體金屬)到10(羽毛)之間。

    如果你想同時使用變換和物理來控制對象,那么給他一個剛體組件并將其設(shè)置為Kinematic

    如果你通過變換來移動對象,同時又想收到對象的碰撞消息,那么必須給他一個剛體組件。

    Mass(質(zhì)量):
    學(xué)過物理的同學(xué)們都知道的吧,質(zhì)量越大,慣性越大。這里的單位可以自己統(tǒng)一規(guī)定,但是官方給出的建議是場景中的物體質(zhì)量*好不要相差100倍率以上。估計(jì)是防止兩個質(zhì)量相差太大的物體碰撞后會產(chǎn)生過大的速度,從而影響游戲性能吧。Drag(阻力):這里指的是空氣阻力,當(dāng)游戲物體收到某個作用力的時候,這個值越大越難移動。如果設(shè)置成無限的話,物體會立即停止移動。Angular Drag(角阻力):
    同樣指的是空氣阻力,只不過是用來阻礙物體旋轉(zhuǎn)的。如果設(shè)置成無限的話,物體會立即停止旋轉(zhuǎn)。Use Gravity(使用重力):
    勾選了這個項(xiàng),游戲?qū)ο缶蜁艿街亓τ绊?。Is Kinematic(是否動態(tài)):
    勾選這個選項(xiàng)會使游戲?qū)ο蟛皇芪锢硪娴挠绊?,但這不等同于沒有剛體組件。這通常用于需要用動畫控制的剛體,這樣就不會因?yàn)閼T性而影響動畫了。Interplate(差值類型):如果看到剛體移動的時候一直抽風(fēng)或者運(yùn)動的不是很平滑,可以選擇一種平滑方式:
    None(無差值):不使用差值平滑。
    Interpolate(差值):根據(jù)上一幀來平滑移動。
    Extrapolate(推算):根據(jù)推算下一幀物體的位置來平滑移動。Collision Detection(碰撞檢測方式):
    Discrete(離散):默認(rèn)的碰撞檢測方式。但若當(dāng)物體A運(yùn)動很快的時候,有可能前一幀還在B物體的前面,后一幀就在B物體后面了,這種情況下不會觸發(fā)碰撞事件,所以如果需要檢測這種情況,那就必須使用后兩種檢測方式。
    Continuous(連續(xù)):這種方式可以與有靜態(tài)網(wǎng)格碰撞器的游戲?qū)ο筮M(jìn)行碰撞檢測。
    Continuous Dynamic(動態(tài)連續(xù)):這種方式可以與所有設(shè)置了2或3方式的游戲?qū)ο筮M(jìn)行碰撞檢測。Freeze Position/Rotation(凍結(jié)位置/旋轉(zhuǎn)):
    可以對物體在X、Y、Z三個軸上的位置/旋轉(zhuǎn)進(jìn)行鎖定,即使受到相應(yīng)的力也不會改變,但可以通過腳本來修改。
    *后順便再提一下恒力組件(Constant Force),由于比較容易理解我就不做詳細(xì)介紹了。一共有4個參數(shù),分別是Force/Relative Force(世界/相對作用力)、Torque/Relative Torque(世界/相對扭力)。這些參數(shù)代表了附加在剛體上的XYZ軸方向恒力的大小,另外還要注意必須是剛體才可以添加恒力。