1. 程式人生 > >[專欄精選]Unity剛體詳解

[專欄精選]Unity剛體詳解

本文節選自洪流學堂公眾號專欄《鄭洪智的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,帶你從入門到精通。