雖然UE4官方文檔對碰撞好像講的很清楚,但是嘗試的時候發現有很多問題,而且和官方文檔描述的總會出現一些差異,所以自己總結一下所有有關碰撞的內容,持續更新吧~
下面總結了一般的碰撞以及多組件碰撞的一些問題.如果對UE4碰撞一點也不熟悉建議先看看鏈接 UE4碰撞規則詳解(2016.7.12更新)
如果想進一步深入UE物理引擎相關內容,請參考博客 (UE4物理模塊分析)
任意兩個物體有碰撞的條件
①一定是互相設置了Collision Preset。
②至少有一個實體開啓了simulate physics。
③該static Mesh必須要有碰撞盒(或者這個Actor有碰撞組件,比如sphere collision)
對於多組件實體Actor,只要那個組件的父組件開啓了simulate physics,就相當於其子組件也開啓了simulate physics。
如果你滿足了我說的條件還沒有碰撞,請先看看UE4碰撞規則詳解(2016.7.12更新)裏面第8條講解了一些可能遇到的坑。
OnActorHit事件響應條件
①事件所對應的物體必須開啓了Simulating Generates Hit Events。
②而另一個與之碰撞的實體則不是必須要開啓。
③二者至少有一個開啓來simulate physics。
(有些情況下,必須要兩個物體都開啓了Simulating GeneratesHit Events纔可以。具體的情況我正在嘗試總結。對於一個character角色很特別,即使character與被撞到的物體都沒有開啓了Simulating Generates HitEvents,被撞物體的OnActorHit事件也會執行)
OnActorOverlap事件響應條件
①兩個發生重疊的實體都要保證開啓了Generate Overlap Events。
②並且在其中任意一個碰撞預設(Collision Presets)裏面對另一方設立了overlap。
(這裏可能官方文檔描述有些區別,大家可以試試)
OnActorHit與OnComponentHit
對於存在於編輯器場景的實體,添加的是OnActorHit
藍圖裏面對每個組件添加碰撞都是OnComponentHit事件。
Component一般是Actor的子組件,Actor可以無限制的添加組件
藍圖裏面對每個組件添加碰撞都是OnComponentHit事件。
對於OnComponentHit事件,個人角色UE4裏面還是有很多問題,還不清楚是引擎的問題還是其他設置問題,不過有必要總結一下:
1.注意父組件與子組件是兩個實體,如果有二者滿足碰撞條件,注意不要讓二者重疊,否則一旦遊戲中產生這個Actor,兩個組件就會以一定的速度相互排斥開來。所以不要隨意開啓組件的simulate physics並且注意各個組件之間的關係。(下圖父組件是CollisionComponent,是一個球形碰撞體;子組件有兩個,sphere是一個static mesh,Capsule是一個膠囊碰撞體)
2.一個Actor內的組件之間可以發生碰撞,也可以響應OnComponentHit。同時,OnActorHit事件也會響應。
3.對於一個擁有子組件(Component)的父組件,如果這個父組件的simulate physics開啓。那麼只要子組件的Simulating Generates Hit Events開啓,必定會響應子組件的OnCompnentHit事件。
4.Actor父組件與子組件的Mobility(可移動性)時刻保持一致。任意一個父組件的simulate physics開啓,其他的組件沒有開啓,則其他組件會與父組件保持相對位置。如果子組件開啓,則只會影響自己(各個組件相互獨立)。
5.如果一個Actor的子組件的OnComponentHit事件響應(此時父組件以及其他任意組件都不需要開啓Simulating Generates Hit Events與simulate physics),那麼這個Actor的OnActorHit也會響應。
6.在EventGraph中EventHit事件比OnComponentHit響應優先級要高。
碰撞藍圖調試問題:
如果一個Actor在場景中對應多個實體,那麼這多個Actor自身EventGraph對應的OnComponentHit事件在調試時只會執行一個Actor的流程。至於執行具體哪個Actor,應該是最新的那個實體,雖然調試只能調試一個,但是其實每個Actor其實都是執行了的。下面是一些其他的注意事項:
1.你可能會發現有一些Static Mesh可以開啓simulat physics,但是沒有效果(比如例子程序中的Floor_400X400,即使開啓也不會與任何物體碰撞)還有一些Mesh不能進行物理模擬。這樣的話可以雙擊該文件並進入靜態網格編輯器界面,給其添加碰撞盒,左邊紅色框可以給其添加簡單的碰撞盒(最多支持26個碰撞面),添加之後右邊的第二個紅框的Collision Complexity也要有對應的碰撞選項,比如現在是簡單的碰撞,就不要添加圖中的Use Complex Collision As Simple,這樣會碰撞盒無效。
上圖中的參數就可以通過靜態網格界面來改變。
2.有關character的複雜碰撞問題
發現對於擁有Mesh等多個Component的藍圖Actor,如果想觸發其他實體的OnActorOverlap必須要使Mesh的Generate OverlapEvents開啓。(當然碰撞預設裏面也要設置)對於一個character角色很特別,如果想觸發其他實體的OnActorCollision。即使character與被撞到的物體都沒有開啓了Simulating Generates HitEvents,被撞物體的OnActorHit事件也會執行
關於Physics Bodies的相關參數意義,可參考鏈接 Physics Bodies(中文翻譯)—UE4官方文檔