用Unity來(lái)實(shí)現(xiàn)一下繩子效果——Obi Rope插件介紹

作者:對(duì)馬騎馬使用炎拳
(本文作者?@對(duì)馬騎馬使用炎拳)
今年年中的時(shí)候,《最后生還者2》引發(fā)了業(yè)界非常熱烈的大討論。
有關(guān)劇情、人物描繪的爭(zhēng)議自然是最為集火的一環(huán)。可參看這里:https://www.zhihu.com/question/402058205/answer/1298663115
而除此之外,還有眾多有關(guān)游戲的細(xì)節(jié)也確實(shí)讓人印象深刻。比如下面這個(gè)繩子:

可以看到,圖中的繩子可以做到和游戲中的環(huán)境進(jìn)行實(shí)時(shí)交互,拉伸,緊繃等屬性都能很好的展現(xiàn),而艾莉本人也有對(duì)應(yīng)的各種狀態(tài)下的反應(yīng)動(dòng)作,實(shí)在是細(xì)節(jié)無(wú)限大。
那么問(wèn)題來(lái)了。不說(shuō)高度還原,有沒(méi)有可能比較方便地在Unity中實(shí)現(xiàn)相對(duì)類(lèi)似的效果呢?
還真有。在Unity商店搜索“Obi”,就可以找到“Obi Rope ”這款模擬繩子的插件。這款插件是由西班牙工作室“Virtual Method ”開(kāi)發(fā),他們于2002年成立,為許多歐美游戲大廠提供過(guò)技術(shù)支持。"Obi"系列則是這家工作室為Unity制作的,可實(shí)時(shí)模擬繩索,流體,布料和軟體的插件。

從商店直接下載Obi rope導(dǎo)入工程,可以看到官方在RopeAndRod文件夾下提供了10個(gè)案例學(xué)習(xí),其中Crane(起重機(jī))和Plectoneme(交纏螺旋)則是對(duì)應(yīng)繩子的拉伸和旋轉(zhuǎn)的使用場(chǎng)景,有點(diǎn)內(nèi)味兒了。



接下來(lái)我們可以看一看RopeAndJoint場(chǎng)景,這個(gè)案例比較詳細(xì)的展示了Obi rope的用法。

首先自然是繩子,選中繩子,可以看到兩條繩子都掛載到了名為Obi solver的物體下,Obi solver身上帶有兩個(gè)腳本“Obi Solver”和”Obi Fixed Updater”。

從官方文檔中得知,Obi solver?負(fù)責(zé)模擬粒子的物理屬性并執(zhí)行約束,這句話有些抽象,但我們只要知道怎么用就好了,其中有三點(diǎn)很重要:
1:Obi solver 可以添加到任意GameObject中,同一場(chǎng)景允許運(yùn)行多個(gè)。
2:繩子必須是Obi solver子級(jí)才能實(shí)時(shí)更新運(yùn)動(dòng)和仿真。
3: 每個(gè)solver獨(dú)立與其他solver ,所以不同的solver 下的子物體不會(huì)互相影響,只有同一solver下的繩子才會(huì)相互反應(yīng)。

涉及Obi solver 的相關(guān)設(shè)置很多,這里不過(guò)多贅述,新建solver時(shí)選擇默認(rèn)的就好。
接下來(lái)看Obi Fixed Updater,顧名思義,這個(gè)組件會(huì)讓solver下的子物體在FixedUpadte()期間更新。同樣,你需要手動(dòng)選擇你希望運(yùn)行的Obi solver添加到Updater中,不過(guò)obi很貼心,當(dāng)你新建Obi solver時(shí)會(huì)自動(dòng)添加到Updater的Solvers里。

Solvers 下面的兩個(gè)參數(shù),
Substep Unity physics,勾選上之后,該solver下的繩子能夠與場(chǎng)景中的物體進(jìn)行更精準(zhǔn)的交互,一般默認(rèn)勾選。
Substeps控制繩子的模擬精度,Unity中默認(rèn)的timestep為0.02,假如在這兒設(shè)置Substep=4,那每次運(yùn)行程序?qū)?huì)計(jì)算出0.02/4=0.005s的繩子的運(yùn)動(dòng)軌跡??偨Y(jié)下來(lái)就是,Substep值越大,模擬精度越高,程序性能越低。
接下來(lái)看繩子,也就是Obi Solver下的Obi Rope。每條繩子分別掛載了“Obi Rope”,”O(jiān)bi RopeExtruded Renderer”,”O(jiān)bi Path Smoother”以及多個(gè)”O(jiān)bi Particle Attachment”組件。

先來(lái)看看Obi Rope組件?,Obi Rope 中比較重要的功能就是繩子編輯器Blueprint,Obi 提供了一些不同種類(lèi)的繩子資源,這里我們選擇“Joint rope1”就好,之后點(diǎn)擊Edit path ,你就可以在場(chǎng)景中對(duì)繩子進(jìn)行編輯。


你也可以按住shift,同時(shí)選擇多個(gè)節(jié)點(diǎn)進(jìn)行操作,Path Editor的其他參數(shù)解釋中,tangent mode 三種模式同樣很好理解,如下圖:

Thickness控制繩索在該點(diǎn)的粗細(xì),mass控制粒子的質(zhì)量,phase是個(gè)很重要的屬性,可以后面結(jié)合Obi Collider一起說(shuō)。
第二個(gè)組件是Obi path Smoother ,這個(gè)組件決定繩子的渲染

第一個(gè)參數(shù)Decimation ,官方文檔用了一張圖進(jìn)行解釋?zhuān)憧梢栽赨nity場(chǎng)景中選擇Wireframe模式進(jìn)行觀察,會(huì)發(fā)現(xiàn)Decimation 值越大,繩子的面片越少,性能自然也會(huì)得到提升。

第二個(gè)參數(shù)Smoothing,值越大繩子越滑。

第三個(gè)參數(shù)Twist,決定每個(gè)繩索鏈結(jié)部分的扭曲度數(shù),如下圖。

第三個(gè)組件是?Obi RopeExtruded Renderer,Obi一共提供了四種渲染器,該渲染器是創(chuàng)建新的Obi Rope 時(shí)默認(rèn)的。此處也不展開(kāi)說(shuō)(好麻煩哈哈),有興趣的可以查閱文檔自己探索。(文檔地址文末)

最后一個(gè)組件是Obi Particle Attachment,這個(gè)組件用于將繩子的一端粘合到另外一個(gè)對(duì)象上,使用方法也很簡(jiǎn)單,選擇繩子的的一個(gè)粒子組,并給這個(gè)粒子組指定對(duì)應(yīng)的粘合物體,繩子的這個(gè)粒子組所在的位置就會(huì)粘合在這個(gè)物體上并跟隨運(yùn)動(dòng)。

Particle Attachment有兩種Type " Dynamic"和"static",此場(chǎng)景中的該組件都選擇的是”Dynamic“,官方文檔中也對(duì)這兩種模式進(jìn)行了詳細(xì)說(shuō)明:
先來(lái)看static模式,官方的解釋是static type 下,組件會(huì)完全取消激活被選中的粒子的動(dòng)力學(xué)。實(shí)際上就是粒子的運(yùn)動(dòng)的慣性對(duì)其綁定的物體不會(huì)有任何影響,此時(shí)該粒子的運(yùn)動(dòng)完全由綁定物體決定。
再來(lái)看Dynamic模式就好理解了,選擇Dynamic后組件會(huì)和粒子的運(yùn)動(dòng)慣性互相影響,選擇了Dynamic 后會(huì)多出兩個(gè)參數(shù),"Compliance"決定連接點(diǎn)的牢固性,Compliance =0,連接點(diǎn)會(huì)非常牢固,Compliance值越大,連接點(diǎn)越靈活;"Break threshold”=連接點(diǎn)可以不被扯斷的最大的力。
最后讓我們看下兩種模式下的GIF圖,來(lái)體會(huì)其中的不同:


需要注意的是:Target的物體需要帶有Obi collider組件。
在案例中,繩子和場(chǎng)景中的地板墻壁都添加了 Obi Collider和Obi Rigidbody, Obi Collider的作用就是讓繩子能與其他元素發(fā)生碰撞。除了Polygon Collider2D, Obi支持幾乎所有的Unity 碰撞器。
如果你希望能忽略一些特定的碰撞體,就可以用到Phase(碰撞階段),每個(gè)obi Collider都具有phase屬性,而Obi Rope也同樣具有phase 通道,當(dāng)Obi collider的 phase 和Obi rope的值相同時(shí),他們將彼此忽略。默認(rèn)情況下,Obi Collider 的phase=0,Obi rope的phase = 1。

需要注意的是,在不同Obi solver 下創(chuàng)建的Obi 物體,就算phase值相同也不會(huì)產(chǎn)生交互效果。
Obi Rigidbody僅包含一個(gè)參數(shù),選中"Kinematic For Paticle"后,物體不會(huì)被繩子影響,但繩子還是能感受到物體的存在(老二刺螈了)。
文章的最后,用Unity娘來(lái)稍微致敬下(拿著鎖鏈似乎某種屬性覺(jué)醒了的感覺(jué)):

Obi 官方文檔:http://obi.virtualmethodstudio.com/tutorials/
Obi 工作室博客:http://blog.virtualmethodstudio.com/
PS :可能有朋友覺(jué)得Obi系列插件太貴,只是想學(xué)習(xí)一下,Unity商店有另外一套模擬流體、彈性布料的插件Flex,由英偉達(dá)制作,效果同樣很爆炸,而且是免費(fèi)的,不多說(shuō)直接上圖:


感興趣的同學(xué)可以戳下面的視頻,非常詳細(xì)的介紹了這個(gè)插件:
【萌新圖形學(xué)】簡(jiǎn)單看看新一代的物理引擎——FLeX簡(jiǎn)介
——分割線——
歡迎加入游戲開(kāi)發(fā)群歡樂(lè)攪基:1082025059
對(duì)游戲開(kāi)發(fā)感興趣的童鞋可戳這里進(jìn)一步了解皮皮關(guān):http://www.levelpp.com/