選擇什麼樣的碰撞顯然是很重要的。但它可能會很棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統能夠一眼看上去有點複雜,但它是很強大和一致的,所以我想給一點背景知識關於怎樣完畢它。
我們會談論碰撞的不同反應,我們怎樣使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不同。
首先你要知道的是。當你談論一些事應該發生碰撞,你必須選擇能否夠穿透(penetrate)它。
一面磚牆會堵塞乙個玩家,但乙個觸發器(trigger)會使它們重疊,同意它們重疊。它們都會產生乙個事件(在ue4中的術語分別為擊中(hit)或重疊(overlap)),只是這是乙個重要的區別。而其他物件能夠忽略互相碰撞。這給了我們三種不同的碰撞型別。
追蹤通道和物件通道想象一下我們在我們的遊戲中定義了兩個「追蹤通道」。乙個是「可見性」,乙個是「**」查詢。一面磚牆是用來堵塞它們。乙個灌木堵塞「可見性」可是不堵塞「**」,乙個防彈玻璃堵塞「**」可是不堵塞「可見性」。當你做這樣的查詢。你指定了單個追蹤通道。
假設我們對此改變了,因此遊戲**必須知道什麼物件型別用來查詢,我們遊戲可能須要大量的不同型別來處理全部這些場景!它也同意我們之後在內容做「現場修復」,而不是改動呼叫**本身和破壞其他的東西。
然而有一些情況下。你想做只基於它們型別的物件查詢,這就是我們用的物件通道。乙個樣例是乙個**發生。你想高速查詢在一定半徑內的「pawn」或「physicsbody」型別的全部物件。
當你做這樣的型別的查詢時,你能夠指定多物件通道。
ue4有一些「內建」追蹤通道(可見性,攝像機)和物件通道(世界靜態、世界動態、pawn、physicsbody、vehicle、可破壞),可是你能夠簡單地通過編輯->專案設定->碰撞加入你自己的通道。雖然你被限制在32個通道總數內。
運動物件間的碰撞
當你想處理移動物件的時候,事情變得有一點複雜。由於這裡有許多種組合。在ue4。每乙個物件知道它自己的物件通道。加入乙個列表關於怎樣響應其他物件通道。當兩個物體相交。我們著眼於他們怎樣互相響應,和採取最小堵塞(least blocking)互動,例如以下圖所看到的:
所以想象以下的場景:
如今這個角色向前移動。
首先它會與灌木叢(shrub)重疊。玩家是pawn型別,而且灌木叢想要與它重疊。shrub是世界靜態(worldstatic)型別,而且玩家想要堵塞它。檢查上面那個**。終於的結果是重疊!相同的,磚牆和玩家都想堵塞對方。所以玩家走過灌木叢(產生重疊事件)和它會被牆截停(產生擊中事件)。
假設你有兩個玩家。而且乙個想變成「幽靈」,你能夠讓它到pawn的響應頻道從block改為ignore。然後他會穿透其他玩家。
碰撞預設
雖然這個系統給了大量控制關於你的場景中的物件怎樣與其他物件碰撞,實際上大多數物件在使用共同的配置。為了讓事情更簡單,ue4有乙個「碰撞預設」系統。每乙個預設包括了乙個物件型別,和在你的遊戲中的對於每乙個追蹤和物件通道的乙個響應。
當你選擇場景中的乙個物件,你會看到乙個簡單的下拉列表,同意你選擇乙個預設:
ue4有幾種內建通道(比如不可見牆,物理actor等等),而且你能夠在專案設定建立自己的通道。假設你不想使用預設,你能夠選擇「自己定義…」然後你能夠改動每乙個響應。像我們例如以下談論的:
簡單和複雜碰撞
最後一件事要理解的是:ue4中的每乙個物件都有「複雜」和「簡單」碰撞表示。複雜的碰撞指使用實際的渲染幾何體碰撞。
這對於**追蹤來說是最實用的東西。你能夠射擊你能看得到的東西。雖然你不總是想要碰撞這個,而且每乙個網格也能夠有簡單碰撞表現。其由球體、盒子、膠囊體和凸外殼集合組成。當你執行碰撞查詢,你告訴ue4你想要碰撞的幾何體。比如,角色移動,使用簡單幾何體碰撞。來避免在細節上的卡住。
總結
*我們實際上在第乙個堵塞碰撞發生後停止繼續查詢碰撞。這是乙個很好的效能優化——想象開了一槍範圍可達1km的子彈打中了距離你1m的牆,我們省去了999公尺的工作!
虛幻4 碰撞過濾
英文原文 選擇什麼樣的碰撞顯然是非常重要的,但它可能會非常棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統可以一眼看上去有點複雜,但它是非常強大和一致的,所以我想給一點背景知識關於如何完成它。我們會談論碰撞的不同反應,我們如何使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不...
虛幻4 碰撞過濾
選擇什麼樣的碰撞顯然是很重要的。但它可能會很棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統能夠一眼看上去有點複雜,但它是很強大和一致的,所以我想給一點背景知識關於怎樣完畢它。我們會談論碰撞的不同反應,我們怎樣使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不同。首先你要知道...
虛幻4 反射
今天講了虛幻4的反射機制。例子 uclass class testcpp api atestcppgamemode public agamemode generated body 部分,做了一大堆一大堆事情。定義在這個檔案中 先看他的定義 define body macro combine inne...