UE5管理內(nèi)容-為靜態(tài)網(wǎng)格體設(shè)置碰撞體積

在?虛幻引擎?中,你可以對(duì)?靜態(tài)網(wǎng)格體?做很多事情,比如在游戲中動(dòng)態(tài)地改變其?紋理?或?材質(zhì),或者使用?Sequencer,讓其在?關(guān)卡?中移動(dòng)。無(wú)論靜態(tài)網(wǎng)格體在關(guān)卡中的行為方式為何,你可能都不希望玩家可以穿過(guò)網(wǎng)格體或射穿網(wǎng)格體。這種情況下就需要在靜態(tài)網(wǎng)格體上設(shè)置碰撞。
設(shè)置
開(kāi)始之前,使用?第一人稱游戲?模板創(chuàng)建一個(gè)新的項(xiàng)目并啟用?初始內(nèi)容(Starter Content)。
你自己可能已具有關(guān)卡和靜態(tài)網(wǎng)格體,可配合本指南使用。這樣的話,你可以跳過(guò)此步驟。然而,使用此模板,你可以射出發(fā)射物來(lái)說(shuō)明下文中的一個(gè)要點(diǎn),因此使用該模板將有助于你跟隨所述步驟進(jìn)行操作。

打開(kāi)項(xiàng)目之后,在?內(nèi)容瀏覽器?中,你可以搜索或直接定位到??內(nèi)容(Content) > 初學(xué)者內(nèi)容(Starter Content) > 道具(Props),找到名為?SM_Door?的靜態(tài)網(wǎng)格體。


SM_Door?中的?SM?代表靜態(tài)網(wǎng)格體(Static Mesh)并且遵循虛幻引擎推薦的命名規(guī)則。使用統(tǒng)一的命名規(guī)則可以讓項(xiàng)目保持整潔。
找到?SM_Door?之后,通過(guò)以下方式打開(kāi)?靜態(tài)網(wǎng)格體編輯器(Static Mesh Editor):
雙擊?該資產(chǎn)。
右鍵單擊?該資產(chǎn)并從菜單中選擇?編輯(Edit)?。
編輯器打開(kāi)之后,你將看到與下圖所示相似的界面:

簡(jiǎn)易形狀網(wǎng)格體上的碰撞
默認(rèn)情況下,此網(wǎng)格體上尚未設(shè)置任何碰撞。如果沒(méi)有碰撞,玩家將能夠穿越網(wǎng)格體。
在設(shè)置碰撞之前,你可以將這個(gè)門(mén)放進(jìn)關(guān)卡中來(lái)對(duì)此進(jìn)行測(cè)試。

另外,如果你想要門(mén)在遭到射擊時(shí)彈開(kāi)或者先飛到空中然后掉到地上,你需要在?細(xì)節(jié)(Details)?面板中將?模擬物理(Simulate Physics)?設(shè)置為?true?。然而,如果靜態(tài)網(wǎng)格體沒(méi)有碰撞,你無(wú)法在默認(rèn)情況下進(jìn)行此設(shè)置。

在大多數(shù)情況下,我們并不需要這些效果,因此我們要為此靜態(tài)網(wǎng)格體設(shè)置碰撞。
在靜態(tài)網(wǎng)格體編輯器頂部的菜單欄,有一個(gè)?碰撞(Collision)?下拉菜單。點(diǎn)擊它,你將看到為網(wǎng)格體添加碰撞所需的選項(xiàng)。也可以點(diǎn)擊工具欄中的?碰撞(Collision)?按鈕來(lái)訪問(wèn)這些選項(xiàng)。(??

)

我們使用的門(mén)網(wǎng)格體形狀非常簡(jiǎn)單。我們可以很輕松地為這個(gè)網(wǎng)格體設(shè)置好碰撞。
碰撞(Collision)?菜單中的前三個(gè)選項(xiàng)將以簡(jiǎn)單的碰撞體包圍靜態(tài)網(wǎng)格體,可將其用作劃分可阻擋及不可阻擋哪些對(duì)象以及哪些對(duì)象可與該網(wǎng)格體重疊的邊界。以下是添加了這些簡(jiǎn)單形狀碰撞網(wǎng)格體的門(mén)狀網(wǎng)格體的示例。






如果已為網(wǎng)格體設(shè)置了簡(jiǎn)單碰撞,然后又為該網(wǎng)格體添加了另一個(gè)簡(jiǎn)單碰撞,新碰撞不會(huì)替換前面已設(shè)置的碰撞,而是疊加在第一個(gè)碰撞上面。?
添加上面的三個(gè)簡(jiǎn)單碰撞體后,會(huì)得到如下圖所示的效果。

要解決此問(wèn)題,你可以:
選中其中一個(gè)碰撞并按?delete?鍵。
從?碰撞(Collision)?下拉菜單中選擇?刪除所選碰撞(Delete Selected Collision)?來(lái)逐個(gè)刪除這些碰撞。
在?碰撞(Collision)?菜單中選擇?刪除碰撞(Remove Collision)?來(lái)一次性刪除靜態(tài)網(wǎng)格體上的所有碰撞。

在為網(wǎng)格體應(yīng)用碰撞之后,點(diǎn)擊碰撞網(wǎng)格體,會(huì)看到一個(gè)平移小控件??梢云揭?、旋轉(zhuǎn)和縮放碰撞網(wǎng)格體,與對(duì)UE5中的其它任意對(duì)象執(zhí)行這些操作一樣。
較復(fù)雜的網(wǎng)格體上的碰撞
使用我們?cè)谇耙徊糠种性O(shè)置的簡(jiǎn)單碰撞體,對(duì)于以下情況足夠:
靜態(tài)網(wǎng)格體可輕松容納在膠囊體或盒體里面。
靜態(tài)網(wǎng)格體是否擁有精確的碰撞并不重要。
但是,你可能具有形狀更加復(fù)雜而且需要具有精確碰撞的靜態(tài)網(wǎng)格體。在此部分中,我們將詳細(xì)介紹如何進(jìn)行此設(shè)置。
返回到?Starter Content?中的?Props?文件夾,找到靜態(tài)網(wǎng)格體?SM_Chair。雙擊?縮略圖,在靜態(tài)網(wǎng)格體編輯器中將其打開(kāi)。
正如你所見(jiàn),此網(wǎng)格體上已具有碰撞,其外觀類似于下圖中所示:

我們假設(shè)在此示例中,我們希望玩家能夠直接坐到椅墊上。受到在默認(rèn)情況下按原樣設(shè)置的碰撞網(wǎng)格體的影響,存在阻礙玩家這樣做的無(wú)形障礙。
在游戲過(guò)程中,玩家僅會(huì)看到靜態(tài)網(wǎng)格體本身,他們看不到碰撞網(wǎng)格體,因此玩家將嘗試坐到椅子上,但是不明白為何會(huì)存在東西阻礙他們這樣做。
可以通過(guò)從編輯器頂部的?碰撞(Collision)?下拉菜單中選擇?刪除碰撞(Remove Collision)?來(lái)刪除此網(wǎng)格體上的碰撞。我們可以嘗試使用我們?cè)诒局改系那耙徊糠种惺褂玫幕拘螤钆鲎簿W(wǎng)格體,但是如你在下列各圖中所見(jiàn),它們之中沒(méi)有一個(gè)可以滿足我們的需求。



似乎沒(méi)有基本形狀可以實(shí)現(xiàn)我們需要的精確碰撞。但是,借助?碰撞(Collision)?下拉菜單中的其他選項(xiàng),我們距離實(shí)現(xiàn)預(yù)期效果更近一步。這些選項(xiàng)被稱為?K-DOP?簡(jiǎn)單碰撞生成器。
K-DOP是一種包圍體積,K-DOP指的是?K離散定向多面體(其中,K是軸對(duì)齊平面的數(shù)量)。從根本上說(shuō),它將K個(gè)軸對(duì)齊平面盡量推向網(wǎng)格體。產(chǎn)生的形狀被用作碰撞外殼。
在靜態(tài)網(wǎng)格體編輯器中,K可以為:
10?- 有4個(gè)邊經(jīng)過(guò)倒角處理的盒體 - 你可以選擇與X、Y或Z軸對(duì)齊的邊。
18?- 所有邊都經(jīng)過(guò)倒角處理的盒體。
26?- 所有邊和角都經(jīng)過(guò)倒角處理的盒體。

以下是分別具有10-DOP、18-DOP和26-DOP碰撞設(shè)置時(shí)的椅子網(wǎng)格體的效果。



這些碰撞網(wǎng)格體已經(jīng)越來(lái)越接近我們想要的效果,但是這些碰撞網(wǎng)格體距離椅墊仍有一段距離,該距離仍可能會(huì)阻止玩家坐到椅子上。
再一次選擇?刪除碰撞(Remove Collision),完成后,從?碰撞(Collision)?下拉菜單中選擇?自動(dòng)凸包碰撞(Auto Convex Collision)。

細(xì)節(jié)?面板中將顯示?凸包分解(Convex Decomposition)?面板,其外觀類似于下圖中所示。

下表是?凸包分解(Convex Decomposition)?面板中的各個(gè)選項(xiàng)。
外殼數(shù)量(Hull Count)
指定用來(lái)表示碰撞體的圖元的數(shù)量。
最大外殼頂點(diǎn)數(shù)(Max Hull Verts)
增加或者減少你的碰撞體所包含的頂點(diǎn)數(shù)。
外殼精度(Hull Precision)
生成碰撞體時(shí)體素的數(shù)量。
這些數(shù)值越高,你的碰撞體便會(huì)越精準(zhǔn),但是也越復(fù)雜。點(diǎn)擊?應(yīng)用(Apply)?會(huì)將這些設(shè)置應(yīng)用到你的靜態(tài)網(wǎng)格體上,并且使碰撞體積可見(jiàn)。


設(shè)置復(fù)雜碰撞的另一個(gè)簡(jiǎn)單方法是使用多個(gè)簡(jiǎn)單形狀碰撞網(wǎng)格體。正如我們?cè)诒局改锨懊嫣岬竭^(guò)的,創(chuàng)建另一個(gè)簡(jiǎn)單碰撞網(wǎng)格體并不會(huì)將原始的簡(jiǎn)單碰撞網(wǎng)格體替換掉,而是疊加在原始簡(jiǎn)單碰撞網(wǎng)格體上。此外,每個(gè)碰撞網(wǎng)格體都有其專屬的變形小控件,因此你可以單獨(dú)對(duì)每個(gè)碰撞網(wǎng)格體進(jìn)行平移、旋轉(zhuǎn)和縮放。我們可以利用此機(jī)制來(lái)為靜態(tài)網(wǎng)格體創(chuàng)建碰撞。
要進(jìn)行該操作,首先從?碰撞(Collision)?下拉菜單中選擇?添加盒體簡(jiǎn)單碰撞(Add Box Simplified Collision)。點(diǎn)擊?該碰撞體以調(diào)出其變換控件。
接著,對(duì)該碰撞網(wǎng)格體進(jìn)行平移、旋轉(zhuǎn)和縮放,以使它沿著椅子扶手貼合椅子,直至地面。

在仍然選中該碰撞網(wǎng)格體的情況下,通過(guò)從?碰撞(Collision)?下拉菜單中選擇?復(fù)制所選碰撞(Duplicate Selected Collision)?或通過(guò)按下?Ctrl + D?組合鍵來(lái)復(fù)制該碰撞網(wǎng)格體。
移動(dòng)此碰撞網(wǎng)格體,使它貼合椅子另一邊的扶手。

再次復(fù)制網(wǎng)格體。在選中新網(wǎng)格體的情況下,移動(dòng),縮放并旋轉(zhuǎn)此網(wǎng)格體,以便它貼合椅子底部。

復(fù)制該碰撞網(wǎng)格體并將它向上移動(dòng)以讓它貼合椅子的坐部。

再次復(fù)制該碰撞體并旋轉(zhuǎn)它,以讓它貼合椅子的靠背。
完成后,你應(yīng)該看到類似下圖的效果。

你可以回過(guò)頭來(lái)再對(duì)這些碰撞體進(jìn)行調(diào)整,但是就現(xiàn)在而言,玩家已經(jīng)可以坐到椅墊上。
模擬物理和碰撞預(yù)設(shè)值
靜態(tài)網(wǎng)格體添加完碰撞體后,現(xiàn)在就可以模擬物理了。單擊靜態(tài)網(wǎng)格體編輯器工具欄最左側(cè)的?保存(Save)按鈕保存椅子網(wǎng)格體。
然后在?內(nèi)容瀏覽器?中找到?SM_Chair。將該網(wǎng)格體拖到關(guān)卡中。選中它,然后轉(zhuǎn)到?細(xì)節(jié)(Details)?面板。
在?細(xì)節(jié)(Details)?面板的?物理(Physics)?部分中,模擬物理(Simulate Physics)?現(xiàn)在已經(jīng)可用,在默認(rèn)情況下,它應(yīng)為?false。如果在模擬物理(Simulate Physics)設(shè)置為?false?的情況下運(yùn)行關(guān)卡,向椅子走動(dòng)或者射出發(fā)射物也不會(huì)影響網(wǎng)格體。然而,你的角色無(wú)法之間穿過(guò)椅子網(wǎng)格體,因?yàn)樗F(xiàn)在有了碰撞。
要在第一人稱射擊模板中向椅子射擊發(fā)射物,你需要先讓角色行走至武器來(lái)拾起它,然后?點(diǎn)擊?進(jìn)行射擊。

停止運(yùn)行關(guān)卡并將?模擬物理(Simulate Physics)?設(shè)置為?true?,F(xiàn)在運(yùn)行關(guān)卡時(shí),你會(huì)看到當(dāng)角色碰到椅子時(shí),椅子網(wǎng)格體會(huì)移動(dòng)。對(duì)著椅子射擊時(shí),該靜態(tài)網(wǎng)格體也可以被射中,而且會(huì)在關(guān)卡中飛到空中。

這不僅是因?yàn)殪o態(tài)網(wǎng)格體在模擬物理,還因?yàn)榫W(wǎng)格體被默認(rèn)?碰撞預(yù)設(shè)值(Collision Preset)?設(shè)置為?物理Actor(Physics Actor)。
返回到椅子的?細(xì)節(jié)(Details)?面板,在?碰撞(Collision)?部分中,具有名稱為?碰撞預(yù)設(shè)值(Collision Preset)?的下拉菜單。該靜態(tài)網(wǎng)格體實(shí)例響應(yīng)場(chǎng)景其他對(duì)象的方式取決于其?碰撞預(yù)設(shè)值(Collision Preset)?設(shè)置。該下拉菜單中包括的選項(xiàng)如下圖中所示。

如果將它設(shè)置為?重疊全部(Overlap All),只要一開(kāi)始運(yùn)行關(guān)卡,你就會(huì)看到該靜態(tài)網(wǎng)格體掉落到關(guān)卡之外。其中還包括自定義預(yù)設(shè)值,借助它你可以手動(dòng)設(shè)置網(wǎng)格體對(duì)關(guān)卡中的其他對(duì)象做出反應(yīng)的方式。
你可以將它設(shè)置為阻擋Pawn,但是可以與發(fā)射物重疊,并且忽略除這些以外的其他所有對(duì)象。在自定義預(yù)設(shè)值中,你可以指示靜態(tài)網(wǎng)格體要執(zhí)行哪些行為。
在關(guān)卡編輯器中選中?靜態(tài)網(wǎng)格體Actor?或任意?靜態(tài)網(wǎng)格體組件(例如,藍(lán)圖編輯器中的靜態(tài)網(wǎng)格體組件)時(shí),細(xì)節(jié)(Details)面板 -> 碰撞(Collision)類別 -> 碰撞預(yù)設(shè)值(Collision Preset)?將顯示為?默認(rèn)(Default)。這是為了表明,在初始設(shè)置之后,未對(duì)"碰撞預(yù)設(shè)值(Collision Preset)"進(jìn)行過(guò)任何更改。如果此處列出了?BlockAll?等其他選項(xiàng),則說(shuō)明所選靜態(tài)網(wǎng)格體Actor/組件的 "碰撞預(yù)設(shè)值(Collision Preset)" 已被覆蓋。

現(xiàn)在你已經(jīng)在網(wǎng)格體上設(shè)置了碰撞,現(xiàn)在可以將網(wǎng)格體放到關(guān)卡中并使用碰撞來(lái)設(shè)置它如何影響關(guān)卡中其它物體并且受關(guān)卡中其它物體影響。