Collision Filtering trong UE


Posted on 21 May 2022

Bài này nói về chuyện collide (va chạm) trong UE, những cái responses khác nhau với collision, cách dùng channels để filter collisions, cũng như liệt ra các điểm khác nhau giữ simple và complex collision geometry.

Blocking, Overlapping và Ignoring

Tương tự bên Unity, có 3 kiểu: blocking, overlapping và ignoring. Một wall có thể “block” player, nhưng trigger có thể “overlap” nó, và trigger có thể xuyên qua. 2 trường hợp đều tạo ra 1 event, nhưng mà khác biệt nhau: “hit” và “overlap”.

“Ignore” là bỏ qua luôn. Không có event không có gì hết.

Tức là có tổng cộng 3 kiểu responses types.

Trace Channels and Object Channels

Hãy tưởng tượng ta có 1 thiết kế như này: Player thì sẽ bị wall block, còn đi xuyên cây. Vì ta set cả Shrub và Wall là WorldStatic, nên làm cách nào để Player có thể chỉ đi xuyên qua Shrub?


Các loại camera view cơ bản

UE đã giải quyết nó bằng cách tạo ra 2 lớp đối chiếu: khi vật A collide với vật B, thì ta sẽ đồng thời tính toán:

  • Vật A sẽ response với vật B như nào (Blocking, Overlapping và Ignoring)
  • Vật B sẽ response với vật A như nào (Blocking, Overlapping và Ignoring)

Sau khi có 2 thông tin này, ta sẽ tổng hợp lại theo bảng sau:


Bảng đối chiếu response

Dễ thấy Player và Shrub là Block + Overlap = Overlap, còn Player với Wall là Block + Block = Block.

Do đó, kết quả là như này:


Kết quả các event

Nếu trong game, ta có 2 player và muốn 1 player trở nên “ghostly”, ta chỉ việc đổi cái response to Pawn channel từ Block sang Ignore mà thôi.

Collision Presets

Tuy nhiên setup tay cũng mệt, UE có sẵn 1 số cái preset cho nhiều built (invi wall, physic actors,…)


Collision preset

Nếu không muốn thì ta có thể custom


Collision custom set

Simple and Complex Collision

Ở UE, mỗi object có thể có “complex” và “simple” collision representation. Complex Collision thì refers về việc sử dụng cái rendering geometry cho collision. Cái này thì vd như weapon traces, ta muốn bắn thì trúng tường hay các vị trí mà ta nhìn thấy (cũng ko quá nhiều cases). Simple thì đơn giản hơn và nhẹ hơn.



Collision view

Conclusion

Vậy là hết rùi đó. Cũng đơn giản dễ hiểu, và khá khá giống Unity nhỉ hehe.