本文節選自洪流學堂公眾號專欄《鄭洪智的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組件的文檔,並做了筆記:
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」
「謝謝智哥,我也發現了用剛體的話性能太差了,我去看看」
「大智,我發現有些情況兩個物體發生了碰撞,但是並沒有調用腳本中的代碼,這是怎麼回事?」
「哈哈,這時候我就要祭出大招了,給你兩個表格,對照著看看是否會發生碰撞哈。」
「太好了,有了這兩個表格,能不能獲取到消息就很清晰了!」
總結「我來簡單總結一下,今天這個Rigidbody組件是物理系統中非常重要的組件,運動的物體都靠它,遇到問題多去查Unity的文檔,裡面解釋的很清楚。」
「好,我已經掌握的差不多了,下一步就是在我的吃雞遊戲裡運用一下,嘿嘿」
「既然你說到了運用,我要給你布置一個小作業,用代碼控制一個剛體在不平整的地形上運動,試試看!」
「收到!我去也!」
「收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。」
洪流學堂公眾號回復專欄,查看更多專欄文章。
《鄭洪智的Unity2018課》,傾盡我8年的開發經驗,結合最新的Unity2018,帶你從入門到精通。