本文節(jié)選自洪流學(xué)堂公眾號專欄《鄭洪智的Unity2018課》,未經(jīng)允許不可轉(zhuǎn)載嗅骄。
洪流學(xué)堂公眾號回復(fù)專欄
胳挎,查看更多專欄文章。
洪流學(xué)堂溺森,讓你快人幾步慕爬。你好,我是鄭洪智屏积。
從這節(jié)課開始医窿,我會嘗試用一種新的寫作風(fēng)格,也希望大家能夠多提意見炊林。
背景補(bǔ)充
小新今年數(shù)學(xué)專業(yè)馬上大三了姥卢,卻一直沒有找到自己的職業(yè)方向,不知道以后要干什么渣聚,唯一的愛好就是玩游戲独榴,特別想自己能開發(fā)一款成功的游戲。小新趁著暑假去找各種實(shí)習(xí)兼職饵逐,一個偶然的機(jī)會收到了一個游戲公司的面試通知括眠。小新欣喜若狂,前去面試倍权,聊到游戲時掷豺,小新能滔滔不絕聊出很多東西捞烟,但是問到開發(fā)游戲的時候,卻啞口無言当船,無法回答面試官的問題题画。面試官問了很多游戲開發(fā)、Unity引擎的問題德频,小新就下定決心苍息,一定要好好學(xué)習(xí)一下游戲開發(fā),特別是Unity引擎壹置。小新找到了自己的師兄大智竞思,這位師兄有8年Unity開發(fā)經(jīng)驗(yàn),想向師兄請教一下學(xué)習(xí)的方向钞护。沒想到師兄特別熱情盖喷,是一個技術(shù)布道者,喜歡研究傳播技術(shù)难咕,從此小新跟著大智開啟了他的Unity學(xué)習(xí)之旅课梳。
大智告訴小新,叫我“大智”就好了余佃,以后不要叫師兄了哈暮刃。
Rigidbody 剛體
“大智,昨天我學(xué)習(xí)了物理系統(tǒng)爆土,知道了碰撞體椭懊,那物理系統(tǒng)里面還有別的東西么?”
“你呀步势,太天真了灾搏,Collider只是物理系統(tǒng)的一部分。你看昨天學(xué)的Collider立润,他們都只是一個靜態(tài)的碰撞體。我們昨天學(xué)習(xí)過物理系統(tǒng)很重要的是模擬物體的受力情況媳板,物體根據(jù)物理規(guī)則運(yùn)動呀桑腮。”
“那通過代碼修改物體的位置不就能運(yùn)動起來了么蛉幸?”
“通過代碼直接修改物體的位置并沒有通過受力的方式改變物體破讨,所以這種方式并沒有應(yīng)用到物理系統(tǒng),要想讓物體通過受力運(yùn)動奕纫,我們首先要了解一下Rigidbody組件提陶。物體只有添加了Rigidbody組件,才會對受力作出反應(yīng)匹层。小新隙笆,你現(xiàn)在先去看看Unity的文檔锌蓄,看看Rigidbody組件到底是什么吧!”
“收到撑柔,我馬上就去看瘸爽!”
小新馬上打開Unity文檔,找到了Rigidbody的介紹文檔https://docs.unity3d.com/Manual/RigidbodiesOverview.html铅忿。
Rigidbody組件可以讓一個物體受到物理影響剪决。比如添加Rigidbody組建后,物體會立馬對重力作出反應(yīng)檀训。如果物體上還添加了Collider柑潦,物體在受到碰撞時也會移動。
“大智峻凫,我知道了渗鬼!Rigidbody可以讓物體對受力做出反應(yīng),但是我有點(diǎn)和Collider搞不清楚了蔚晨≌ё辏”
“這兩個是初學(xué)者不太容易搞清楚的概念。Collider只是給物體加上了碰撞铭腕,讓物體擁有了實(shí)體银择,而不是一個可以穿過去‘全息投影’。而Rigidbody是讓物體擁有了動態(tài)受力的功能累舷。所以我們一般稱只有Collider沒有Rigidbody的物體叫靜態(tài)Collider浩考。一般剛體物體上也會有Collider,因?yàn)樾枰蛣e的物體發(fā)生碰撞被盈。如果沒有Collider析孽,即使剛體也不會和其他物體碰撞≈辉酰”
“那是不是不應(yīng)該給場景里所有的物體添加Rigidbody組件袜瞬?”
“非常對,場景里有一些物體是基本不會動的身堡,比如說一棟大樓邓尤,一塊大石頭等等,他們只需要阻擋別的物體別穿過他們就行了贴谎,所以它們只需要添加Collider就行汞扎。因?yàn)樘砑恿薘igidbody組件后會帶來很多的物理計算,所以只需要給會移動的物體添加Rigidbody就行擅这。”
“我明白了澈魄!我說呢怎么給所有物體添加了Rigidbody后卡的跑不起來呢,我去把我的吃雞場景重新設(shè)置一下仲翎,嘿嘿痹扇!”
“你呀你呀铛漓,真是個急性子!順便好好看一下剛體組件的各個參數(shù)帘营!”
“知道啦票渠!”
Rigidbody組件
小新認(rèn)真看了Rigidbody組件的文檔,并做了筆記:
- Mass 剛體的質(zhì)量芬迄,單位是千克(kg)
- Drag 空氣阻力问顷,0代表沒有空氣阻力,無限大的值代表物體會立即停下來(慣性消失)禀梳。
- Angular Drag 物體受到一個扭力旋轉(zhuǎn)時的阻力杜窄,0代表沒有阻力,但是需要注意的是無限大的值并不能讓物體立即停止旋轉(zhuǎn)算途。
- Use Gravity 是否受重力影響
- Is Kinematic 選中時塞耕,物體不會受到物理物理引擎的影響,只能通過修改Transform移動物體嘴瓤。
-
Interpolate 插值扫外,如果發(fā)現(xiàn)剛體移動有卡頓,可以嘗試選擇此選項廓脆。
- None 不使用插值
- Interpolate 根據(jù)上一幀的Transform進(jìn)行平滑
- Extrapolate 根據(jù)估算的下一幀的Transform進(jìn)行平滑
-
Collision Detection 碰撞檢測的方式筛谚,當(dāng)你的剛體快速運(yùn)動時,可能會出現(xiàn)穿透的現(xiàn)象停忿,可以設(shè)置這個選項驾讲。
- Discrete 離散檢測,性能較高席赂,默認(rèn)值
- Continuous 連續(xù)檢測吮铭。使用此選項時,物體與其他動態(tài)Collider(剛體)使用離散檢測颅停;與其他靜態(tài)Collider使用連續(xù)檢測谓晌。如果其他剛體設(shè)置為了Continuous Dynamic,會使用連續(xù)檢測和這個剛體進(jìn)行碰撞檢測癞揉。這個選項非常影響性能扎谎,如果沒有快速運(yùn)動物體的碰撞檢測問題,保持Discrete設(shè)置
- Continuous Dynamic 動態(tài)連續(xù)檢測烧董。如果其他物體是Continuous或Continuous Dynamic,與這個物體碰撞時會使用連續(xù)檢測胧奔。也會和靜態(tài)Collider使用連續(xù)檢測逊移。對于其他的collider(標(biāo)記為Discrete的Rigidbody)使用離散檢測。龙填。用于快速移動的物體胳泉。
-
Constraints 約束剛體的運(yùn)動
- Freeze Position 選中后剛體不會在對應(yīng)的軸上移動
- Freeze Rotation 選中后剛體不會在對應(yīng)的軸上旋轉(zhuǎn)
小新看完之后拐叉,還是有一些地方不太清楚,又來騷擾大智扇商。
“大智凤瘦,剛體的Is Kinematic我明白了是什么,這個有什么用呢案铺?加上剛體不就是為了受力么蔬芥,為什么還要提供一個這個屬性,關(guān)掉受力呢控汉?”
“有些情況笔诵,我們不想讓物體受力,但是仍然能夠和其他物體發(fā)生碰撞姑子,影響其他物體乎婿。比如這個物體上有動畫,在播放動畫的時候街佑,我們想讓動畫來控制物體的位置谢翎。”
“明白了沐旨,但是感覺還是需要用到的時候再去理解森逮。那這個Collision Detection該什么時候設(shè)置呢?是不是類似子彈這種情況希俩?”
“說的很對吊宋,Collision Detection就是針對快速移動的小物體,比如說子彈颜武,但是通常游戲射擊并不用實(shí)體的子彈璃搜,因?yàn)樽訌椂嗟臅r候性能太差了,我可以給你推薦一個文章來看看:https://zhuanlan.zhihu.com/p/22105641”
“謝謝智哥鳞上,我也發(fā)現(xiàn)了用剛體的話性能太差了这吻,我去看看”
碰撞匯總
“大智,我發(fā)現(xiàn)有些情況兩個物體發(fā)生了碰撞篙议,但是并沒有調(diào)用腳本中的代碼唾糯,這是怎么回事?”
“哈哈鬼贱,這時候我就要祭出大招了移怯,給你兩個表格,對照著看看是否會發(fā)生碰撞哈这难≈畚螅”
“太好了,有了這兩個表格姻乓,能不能獲取到消息就很清晰了嵌溢!”
總結(jié)
“我來簡單總結(jié)一下眯牧,今天這個Rigidbody組件是物理系統(tǒng)中非常重要的組件,運(yùn)動的物體都靠它赖草,遇到問題多去查Unity的文檔学少,里面解釋的很清楚⊙砥铮”
“好版确,我已經(jīng)掌握的差不多了,下一步就是在我的吃雞游戲里運(yùn)用一下腿堤,嘿嘿”
今日思考題
“既然你說到了運(yùn)用阀坏,我要給你布置一個小作業(yè),用代碼控制一個剛體在不平整的地形上運(yùn)動笆檀,試試看忌堂!”
“收到!我去也酗洒!”
“收獲別忘了分享出來士修!也別忘了分享給你學(xué)Unity的朋友,也許能夠幫到他樱衷∑宄埃”
洪流學(xué)堂公眾號回復(fù)專欄
,查看更多專欄文章矩桂。
《鄭洪智的Unity2018課》沸移,傾盡我8年的開發(fā)經(jīng)驗(yàn),結(jié)合最新的Unity2018侄榴,帶你從入門到精通雹锣。