1. 程式人生 > >UE4藍圖碰撞檢測解析

UE4藍圖碰撞檢測解析

 如果想進一步深入UE物理引擎相關內容,請參考部落格

任意兩個物體有碰撞的條件

①一定是互相設定了Collision Preset。

至少有一個實體開啟了simulate physics。

③該static Mesh必須要有碰撞盒(或者這個Actor有碰撞元件,比如sphere collision)

 對於多元件實體Actor,只要那個元件的父元件開啟了simulate physics,就相當於其子元件也開啟了simulate physics。

如果你滿足了我說的條件還沒有碰撞,請先看看


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事件也會執行

原文連結(轉載請標明):http://blog.csdn.net/u012999985/article/details/51113853