[專欄精選]Unity剛體詳解

2021-02-20 洪流學堂

本文節選自洪流學堂公眾號專欄《鄭洪智的Unity2018課》,未經允許不可轉載。

洪流學堂公眾號回復專欄,查看更多專欄文章。

洪流學堂,讓你快人幾步。你好,我是鄭洪智。

從這節課開始,我會嘗試用一種新的寫作風格,也希望大家能夠多提意見。

背景補充

小新今年數學專業馬上大三了,卻一直沒有找到自己的職業方向,不知道以後要幹什麼,唯一的愛好就是玩遊戲,特別想自己能開發一款成功的遊戲。小新趁著暑假去找各種實習兼職,一個偶然的機會收到了一個遊戲公司的面試通知。小新欣喜若狂,前去面試,聊到遊戲時,小新能滔滔不絕聊出很多東西,但是問到開發遊戲的時候,卻啞口無言,無法回答面試官的問題。面試官問了很多遊戲開發、Unity引擎的問題,小新就下定決心,一定要好好學習一下遊戲開發,特別是Unity引擎。小新找到了自己的師兄大智,這位師兄有8年Unity開發經驗,想向師兄請教一下學習的方向。沒想到師兄特別熱情,是一個技術布道者,喜歡研究傳播技術,從此小新跟著大智開啟了他的Unity學習之旅。

大智告訴小新,叫我「大智」就好了,以後不要叫師兄了哈。

Rigidbody 剛體

「大智,昨天我學習了物理系統,知道了碰撞體,那物理系統裡面還有別的東西麼?」
「你呀,太天真了,Collider只是物理系統的一部分。你看昨天學的Collider,他們都只是一個靜態的碰撞體。我們昨天學習過物理系統很重要的是模擬物體的受力情況,物體根據物理規則運動呀。」
「那通過代碼修改物體的位置不就能運動起來了麼?」
「通過代碼直接修改物體的位置並沒有通過受力的方式改變物體,所以這種方式並沒有應用到物理系統,要想讓物體通過受力運動,我們首先要了解一下Rigidbody組件。物體只有添加了Rigidbody組件,才會對受力作出反應。小新,你現在先去看看Unity的文檔,看看Rigidbody組件到底是什麼吧!」
「收到,我馬上就去看!」

小新馬上打開Unity文檔,找到了Rigidbody的介紹文檔https://docs.unity3d.com/Manual/RigidbodiesOverview.html。

Rigidbody組件可以讓一個物體受到物理影響。比如添加Rigidbody組建後,物體會立馬對重力作出反應。如果物體上還添加了Collider,物體在受到碰撞時也會移動。

「大智,我知道了!Rigidbody可以讓物體對受力做出反應,但是我有點和Collider搞不清楚了。」
「這兩個是初學者不太容易搞清楚的概念。Collider只是給物體加上了碰撞,讓物體擁有了實體,而不是一個可以穿過去『全息投影』。而Rigidbody是讓物體擁有了動態受力的功能。所以我們一般稱只有Collider沒有Rigidbody的物體叫靜態Collider。一般剛體物體上也會有Collider,因為需要和別的物體發生碰撞。如果沒有Collider,即使剛體也不會和其他物體碰撞。」
「那是不是不應該給場景裡所有的物體添加Rigidbody組件?」
「非常對,場景裡有一些物體是基本不會動的,比如說一棟大樓,一塊大石頭等等,他們只需要阻擋別的物體別穿過他們就行了,所以它們只需要添加Collider就行。因為添加了Rigidbody組件後會帶來很多的物理計算,所以只需要給會移動的物體添加Rigidbody就行。
「我明白了!我說呢怎麼給所有物體添加了Rigidbody後卡的跑不起來呢,我去把我的吃雞場景重新設置一下,嘿嘿!」
「你呀你呀,真是個急性子!順便好好看一下剛體組件的各個參數!」
「知道啦!」

Rigidbody組件

小新認真看了Rigidbody組件的文檔,並做了筆記:

Mass 剛體的質量,單位是千克(kg)

Drag 空氣阻力,0代表沒有空氣阻力,無限大的值代表物體會立即停下來(慣性消失)。

Angular Drag 物體受到一個扭力旋轉時的阻力,0代表沒有阻力,但是需要注意的是無限大的值並不能讓物體立即停止旋轉。

Use Gravity 是否受重力影響

Is Kinematic 選中時,物體不會受到物理物理引擎的影響,只能通過修改Transform移動物體。

Interpolate 插值,如果發現剛體移動有卡頓,可以嘗試選擇此選項。

None 不使用插值

Interpolate 根據上一幀的Transform進行平滑

Extrapolate 根據估算的下一幀的Transform進行平滑

Collision Detection 碰撞檢測的方式,當你的剛體快速運動時,可能會出現穿透的現象,可以設置這個選項。

Discrete 離散檢測,性能較高,默認值

Continuous 連續檢測。使用此選項時,物體與其他動態Collider(剛體)使用離散檢測;與其他靜態Collider使用連續檢測。如果其他剛體設置為了Continuous Dynamic,會使用連續檢測和這個剛體進行碰撞檢測。這個選項非常影響性能,如果沒有快速運動物體的碰撞檢測問題,保持Discrete設置

Continuous Dynamic 動態連續檢測。如果其他物體是Continuous或Continuous Dynamic,與這個物體碰撞時會使用連續檢測。也會和靜態Collider使用連續檢測。對於其他的collider(標記為Discrete的Rigidbody)使用離散檢測。。用於快速移動的物體。

Constraints 約束剛體的運動

Freeze Position 選中後剛體不會在對應的軸上移動

Freeze Rotation 選中後剛體不會在對應的軸上旋轉

小新看完之後,還是有一些地方不太清楚,又來騷擾大智。
「大智,剛體的Is Kinematic我明白了是什麼,這個有什麼用呢?加上剛體不就是為了受力麼,為什麼還要提供一個這個屬性,關掉受力呢?」
「有些情況,我們不想讓物體受力,但是仍然能夠和其他物體發生碰撞,影響其他物體。比如這個物體上有動畫,在播放動畫的時候,我們想讓動畫來控制物體的位置。」
「明白了,但是感覺還是需要用到的時候再去理解。那這個Collision Detection該什麼時候設置呢?是不是類似子彈這種情況?」
「說的很對,Collision Detection就是針對快速移動的小物體,比如說子彈,但是通常遊戲射擊並不用實體的子彈,因為子彈多的時候性能太差了,我可以給你推薦一個文章來看看:https://zhuanlan.zhihu.com/p/22105641」
「謝謝智哥,我也發現了用剛體的話性能太差了,我去看看」

碰撞匯總

「大智,我發現有些情況兩個物體發生了碰撞,但是並沒有調用腳本中的代碼,這是怎麼回事?」
「哈哈,這時候我就要祭出大招了,給你兩個表格,對照著看看是否會發生碰撞哈。」

OnCollision消息OnTrigger消息

「太好了,有了這兩個表格,能不能獲取到消息就很清晰了!」

總結

「我來簡單總結一下,今天這個Rigidbody組件是物理系統中非常重要的組件,運動的物體都靠它,遇到問題多去查Unity的文檔,裡面解釋的很清楚。」
「好,我已經掌握的差不多了,下一步就是在我的吃雞遊戲裡運用一下,嘿嘿」

今日思考題

「既然你說到了運用,我要給你布置一個小作業,用代碼控制一個剛體在不平整的地形上運動,試試看!」
「收到!我去也!」
「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」

洪流學堂公眾號回復專欄,查看更多專欄文章。

《鄭洪智的Unity2018課》,傾盡我8年的開發經驗,結合最新的Unity2018,帶你從入門到精通。

相關焦點

  • 新手如何從零開始學習unity
    (一)  首先unity的腳本可以用很多語言來寫,比如java,js,c#,用C#,很多人說自己沒有C#的基礎,其實自己自學也能夠學會,在unity中學會簡單的遊戲邏輯開發,其實不需要太多的C#知識,unity用的VS編輯器其實是在C#裡面調用unity的API,因為它在創建腳本的時候引入了一個 unityEngine的空間,這個空間就是unity的 C# API,那麼新手只需要去學習
  • Unity動畫系統詳解6:如何做好角色的移動動畫?(Root Motion詳解)
    明明加了剛體組件啊」「這個是因為動畫在控制人物的Y軸,所以才沒有掉下去」「但是我不都設置Apply Root Motion了麼,咋還這樣呢?」「那你知道Root Motion到底是什麼?」對於你遇到的剛體不會掉落的問題,也能解決了。」「emmm,大概能明白,我還是得去試一試看看不同的效果。第二個問題:什麼是重定向?」「重定向就是把A角色做的動畫用到B角色上。如果A和B兩個角色的骨骼結構完全一樣,那動畫可以直接重用。
  • Unity PBR Standard Shader 實現詳解 (三)
    , data.lightmapUV.xy); half3 bakedColor = DecodeLightmap(bakedColorTex); #ifdef DIRLIGHTMAP_COMBINED fixed4 bakedDirTex = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd,
  • 質點剛體傻傻分不清楚
    所研究的對象不考慮它的變形,稱為剛體。如果考慮變形,該研究對象就稱為變形體,也就是材料力學裡面所要研究的內容。那麼,剛體有什麼作用?我們所研究的很多對象都可以簡化成一種剛體的模型,而這個剛體的模型,它有一個重要的特質?
  • Unity動畫系統詳解10:子狀態機是什麼?
    小新:「好嘞」小新收到了大智QQ發來的信息:https://docs.unity3d.com/Manual/NestedStateMachines.html小新開始認真閱讀文檔,下面是他做的筆記:Sub-State Machines 子狀態機很多時候,角色的一個行動由多個動作組成。
  • 3D場景編輯導出-LayaAir引擎Unity插件使用詳解
    國內下載地址:https://unity.cn/releases?但是,開發者要是採用了例如2019.x等其他版本,則可能會使用到一些2018.4.7不支持的功能,這樣就會在導出時報錯,或者出現LayaAir引擎運行效果與unity編輯效果不一致的情況。所以開發者儘可能採用我們推薦的Unity版本2018.4.7。國內下載地址:https://unity.cn/releases?
  • 關於剛體轉動的前概念研究
    剛體轉動是力學中最重要的部分之一,學生在學習剛體轉動的過程中存在著很多學習困難。本次研究的主要目的就是研究學生在學習剛體轉動過程中存在的前概念,並基於學生的前概念提出教學上的改進建議。1.2 國內外研究現狀國內外對於剛體轉動教育已有一些前期研究。例如Demirci等人通過對100名主修數學的學生進行了研究,發現滾動和轉動是學生最難以理解的概念[1]。
  • [飛控]剛體運動學-歐拉角模型
    剛體運動學模型研究的是與力無關的過程,只研究位置、速度、姿態、角速度等參量,常以質點為模型。仔細回想一下這個過程,你站在C的角度上看,yaw的歐拉角速度是經過了兩次旋轉後你才看見的,而pitch的歐拉角速度是經過一次旋轉才被你看見的,只有roll 的歐拉角速度是被你直接觀察到的。
  • 物理知識:力學-剛體轉動-定軸轉動
    【預習要點】 進入轉動學習 ,首先要明確平動和轉動的區別點 ,了解剛體模型 。定軸轉動是剛體轉動裡最基本的轉動形式 , 通過定軸 轉動運動學 和 轉動 動力學 的學習拉開剛體轉動學習的序幕。了解剛體定軸轉動的轉動特 點 , 即各組成剛體的質元在自己的轉動平面作圓周運動 。
  • iDoNews 專欄精選:詳解《紙牌屋》中的Deep Web
    iDoNews 專欄 02月19日精選 (微信號 iLoveDoNews) Deep Web在我朝一般議成暗網(其實英文裡面還有個dark Internet
  • 力學教學筆記之堅貞不屈的剛體:所有力學的基礎
    同理,對於剛體來說,不管是由多少個質點構成的,它也只有6個自由度——因為剛體中任意兩點之間的距離都是固定不變的。補充一點,質心的概念並不限於剛體,它仍然是所有這些質點構成的「大槓桿」的支點。剛體有6個自由度,剛體中任意挑選的三個點就完全確定了剛體的空間位置,這6個自由度及其隨時間的變化率就確定的剛體的狀態,同樣也是由牛頓定律決定的。這6個自由度可以換個方式描述。
  • 知乎的「野心與終局」 | 本周專欄精選
    小編懷著依依不捨的心情精選了7篇深度的好文與大家分享,畢竟這可是本輪猴年的最後一次專欄精選了。友情提示:點開第七篇連結的時候,要確保媽媽大姨們不在身邊,不然你很難解釋的科科~1、詳解聲紋識別:如何正確評價小度在最強大腦中戰平人類?
  • 物理知識:力學-剛體轉動-2.角動量定理及其守恆
    預習要點: 類比質點平動中牛頓第二定律與動量定理、動能定理的關係,在剛體定軸轉動建立了動力學關係之後,基於剛體轉動所受外力矩與角加速度的動力學關係(轉動定理)是瞬時關係,為了更好的研究剛體轉動的過程關係得到了剛體轉動的角動量定理、
  • Unity自帶函數說明
    在unity的腳本中,有大量的腳本執行按照預先確定的順序執行的事件函數,由於篇幅有限,無法一一列舉,這裡只列舉一些常用的自帶函數的順序,並論述他們之間的區別
  • 剛體轉子陀螺,利用液浮、靜電支撐,液浮支撐結構是怎樣的呢?
    通過昨天的分享,我們知道,剛體陀螺儀根據其轉動自由度的不同可分為單自由度陀螺儀和雙自由度陀螺儀,在工程技術上發展最早,現在仍被廣泛應用的是剛體轉子陀螺儀。剛體轉子陀螺儀主要由兩部分組成:一是繞自身的對稱軸、自轉軸或轉子軸,又稱陀螺主軸,高速旋轉的剛體轉子,通常稱陀螺轉子;二是用來安裝轉子的支撐機構,陀螺轉子是剛體轉子陀螺儀的核心部分。它一般採用高比重的金屬材料做成的空心的圓柱體或實心的圓柱體。今天小航就和大家講一講框架剛體轉子陀螺儀,我們先來看雙自由度框架剛體轉子陀螺儀。
  • 《卡通湖水渲染思路》與《Unity Shader ScreenPos》詳解
    Unity Shader ScreenPos詳解最近有人詢問《卡通湖水渲染》中基於深度著色方法中深度差的計算方法,發現是攝像機深度圖中的深度值(線性化後)減去ScreenPos.w,而不是ScreenPos.z,這一章正好一起講一講屏幕空間位置的計算方法及其中的一些相關原理。其中部分內容涵蓋個人理解,如有疏漏,還請大佬們指正交流!1.
  • 圖形的量化---度量幾何:圖形的運動之剛體運動三種變換
    剛體運動 考慮二維空間的直角坐標系,如果用向量X和Y分別表示兩個點,用d(X,Y)表示兩點之間的距離,則d2(X,Y)=(x1-y1)2+(x2-y2)2。如果利用(3)中的第三個等式,我們可以得到:這與d2(X,Y)是一致的,因此,我們也可以用(4)式定義兩點間的距離。
  • 為什麼說剛體線速度的旋度等於角速度的兩倍
    旋轉軸(根據右手定則定向)指向球中心的場的彎曲方向,F在位置r處的分量,與封閉曲線C在一個平面上的法線和切線,並圍繞一個平面向量區域A=An ,A趨於0時,中心點的旋度如下圖所示上圖對應的旋度公式就是:再分析物理上的剛體運動:角位移矢量
  • Unity動畫系統詳解9:Target Matching是什麼?
    參數詳解小新:「大概知道這個方法是什麼了,那對於跳躍這個動畫,如何應用呢?」大智:「其實只要對這幾個參數多研究一下,就知道怎麼用了。首先前兩個參數是匹配的位置和旋轉,這個不用多說吧?」小新:「嗯嗯,比如我要匹配牆上,那就是牆上的位置,旋轉就是讓手的角度貼合牆,應該可以用調IK的方式來調。
  • 狂王:作者欽定阿修羅四王力量最強者,苦王的阿修羅剛體真可惜
    單就力量來說啊,阿修羅剛體狀態下的苦王可能是四王當中最強的。因為阿修羅剛體是整個阿修羅一組最強的天賦之一,我只能用之一來用來形容它。首先阿修羅一族到底有多少天賦,這是未知的。我之所以用之一來形容的是很有可能。其他天賦可能比阿修羅剛體還要強。但是這個阿修羅剛體的天賦卻得到了傳說中的兩大九十九鬼的承認。那就說明這個天賦的本身上限極其的高。