1. 程式人生 > >UE4碰撞規則詳解(2016.7.12更新)

UE4碰撞規則詳解(2016.7.12更新)

UE4的碰撞設定在官方的文件的 物理模擬模組(連結:點選開啟連結)。但是操作起來感覺坑還是比較多,所以這裡總結一下,以防平時經常會漏掉或忽略某些條件。如果想看關於碰撞響應觸發,可以參考連結( UE4藍圖碰撞檢測解析) 如果想進一步深入UE物理引擎相關內容,請參考部落格 ()

現在開始講解並總結一下UE4裡面的碰撞規則:

1.只有擁有Collision屬性的實體才可以碰撞

每個實體Actor,包括static Mesh,sphere,capsule等帶碰撞的元件,在detail細節面板都有一個collision屬性的欄。這個裡面的引數是控制這些實體間進行碰撞的必要條件。

(注:在UE4裡面,所有可以直接放在UE4場景世界裡的物件都是一個Actor,這個型別在C++中是類AActor。其本身包含了非常多的屬性,如座標,碰撞等必要的特性。繼承於Actor的有Pawn,Character,StaticMeshActor,CameraActor等等,所以在遊戲世界存在的實體都屬於Actor,不過Actor本身可能還包含元件等更多其他的元素)

2.不同實體的碰撞通過碰撞通道來區分

在UE4世界裡面所有帶碰撞的Actor被分為很多類別,比如WorldDynamic,Worldstatic,Pawn,character等,這些型別被稱為一個個collision channel(碰撞物件通道)。一般來說,系統幫你設定了一些基本的collision channel。比如一個設定為靜止的立方體歸屬於Worldstatic,而一個設定為可以動的球體歸屬於WorldDynamic。UE4做的非常的靈活的是,這個通道的型別,你可以任意的設定與新增,這樣,你就可以根據你的情況自由的設定恰當的通道。更自由的是,你可以隨時改變這個實體物件所屬於的通道型別。

3.每一個實體必定有其自身屬於的通道型別

每一個帶有碰撞的Actor都有一個自己屬於的通道型別,這個型別就在下圖的Object Type裡面。

4.每個實體可以通過碰撞預設來設定是否對其他通道型別實體產生碰撞

每一個帶有碰撞的Actor都有一個Collision Presets(我們稱他為碰撞預設),這個預設裡面記錄了他與系統設定裡面所有通道型別之間的碰撞關係。參考下圖,我們可以看到,這個實體本身的通道型別是WorldStatic,碰撞預設為BlockAll,意思就是與所有的實體都會產生碰撞。我們可以看到在下面有一個列表叫Collision Response,下面所有的對號都打在了Block裡面,這就表示這個實體本身與所有打鉤的物件都會產生碰撞。(你會看到還有一個trace response,之後再介紹)除了Block,還有Overlap和Ignore,分別是重疊和忽略。

5.碰撞時相互的,所以兩個相互碰撞的實體設定都要滿足碰撞條件

那是不是下圖的這個實體就會和所有實體都會產生碰撞?不是的!我們知道力的作用是相互的,那這裡的這個預設也是一個道理,另一個物體想與該實體碰撞,必須在這個物體所屬的型別裡面的Block打上對號才可以。這樣二者就會相互碰撞了。

6.重疊事件也很重要,可以作為場景觸發器事件

設定為Ignore和Overlap就不會產生任何碰撞,但是overlap會產生overlap事件(藍圖以及程式碼中可以判斷實體之間是否有重疊,下面有簡單解釋)

7.trace response的理解

除了碰撞的通道,還有trace通道。trace也是一種碰撞檢測的方法,向一個方向位置發射一個射線,對射線擊中的物件進行判斷,進而採取進一步措施。

所以trace response就是設定實體本身發射的trace會不會被其他物件響應。

8.正確設定staticMesh的碰撞盒型別(這是導致很多奇怪問題的重要bug)

每個staticMesh的碰撞盒必須正確對應他的StaticMeshSettings下的CollisionComplexity屬性(雙擊靜態網格物體檔案即可進入編輯器)。這裡簡單介紹一下,每個靜態網格實體都可以在編輯器裡面新增碰撞盒,可以給物體設定簡單的碰撞盒(球型,盒型,10個面的碰撞盒等),也可以設定複雜的碰撞盒。如果你給該靜態物體設定簡單的碰撞盒,StaticMeshSettings下的CollisionComplexity屬性就應該設定為UseSimpleCollisionAsComplexity。如果設定了複雜的碰撞盒(AutoConvexCollision),這個屬性就該為UseComplexityCollisionAsSimple(設定為Default也可以)。如果設定反了,就很容易出現無法正確模擬物理碰撞的情況。

9.最後,我們看一下圖中的Collision Enabled型別。

正常4.8之前的版本有下面三個型別選項,文件基本說的比較通俗,不過有兩點要注意

No Collision(無碰撞) - 不同該物件發生碰撞,無論是蹤跡碰撞還是物理碰撞。
No Physics Collision(無物理碰撞) - 該剛體僅用於射線投射、掃射及重疊。
Collision Enabled(啟用碰撞) - 該剛體用於物理模擬和碰撞查詢。

   a.這個選項類似一個總開關,如果這個地方選擇了No Collision,那麼不管前面怎麼設定通道,也不會產生任何碰撞事件

   b.這個裡面No Physics Collision表示不進行物理模擬,就是說在這個實體移動時不會產生任何碰撞,但是各種重疊的事件還是會觸發的。當這個實體靜止的時候,與Collision Enabled的效果是完全一樣的,可以碰撞也可以觸發各種事件。

4.9之後變為下面的四個型別,如果你在官方文件找不到,切換成英文再查一下就能看到了。(中文文件總是更新的比較慢)

No Collision No collision is enabled for this body.
Query Only This body is used only for collision queries (raycasts, sweeps, and overlaps).
Physics Only This body is used only for physics collision.
Collision Enabled This body interacts with all collision (Query and Physics).

其實4.9之後把原來的No Physics Collision分成了Query Only 和 Physics Only,也就是說Query Only可以進行各種trace,sweep,Overlap事件的觸發,但是不會進行物理模擬,簡單的講就是運動時不會產生任何碰撞。

Physics Only表示只能進行物理碰撞與運動模擬,但是不會觸發任何事件。

舊版本的No Physics Collision與Query Only 基本相同,但是他在靜止時是有碰撞的。

注意:如果這裡設定為No Collision,那麼即使在Actor物件開啟了simulatePhysics(開啟物理模擬)也不會有效,也就不會受到重力而下落

其他注意內容:對於每個StaticMesh型別的Actor(即存在於場景中的實體),他的的detail面板下StaticMesh欄下有一個BlockingVolum,功能是建立一個物理體積。所謂物理體積就是一個遊戲不可見的但是真實存在的實體,可以用於觸發事件等。BlockingVolum就是一個帶碰撞盒的體積,點選這個按鈕,就是給這個實體建立一個單獨的碰撞盒體積。按住Alt+C可以隱藏或者顯示碰撞盒。這個體積可以用於場景中用畫刷刷出來沒有碰撞盒的靜態物體,但是也需要碰撞的物體。

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