무식하게 아무런 참고 자료 없이 직접 테스트해가며 언리얼을 학습했던 시기가 있었다.
그 때 무엇보다 헷갈리는 건 Query와 Physics였다.
카드 게임을 만들던 시절 LineTrace를 통해 커서 아래의 카드를 HitResult로 검출하고, 마우스 이벤트를 통해 해당 카드를 조작(카드 드로우나 드래그를 통한 사용 등)하는 로직을 작성했었는데, 이때 Query와 Physics 때문에 미치고 펄쩍 뛰었던 기억이 있다.
해당 프로젝트를 중간에 그만두고나서야 깨달은 건데, 카드는 Physics가 필요 없었다..
카드 메쉬에 Collision Enable(둘 다 쓰는 거) 설정을 사용했던 게 아직도 생각나곤 한다.
마침 복습겸 보는 강의에서 Collision을 다루고 있으니 정리해 적어보겠다.
Query | Physics | |
---|---|---|
특징 | 단순 Overlap, Block 여부 확인 | 실제 현실처럼 움직임을 표현하고 싶을 때 사용 |
사용 방법 | Collision 설정에서 Query Only 혹은 Collision Enable | Collision 설정에서 Physics Only 혹은 Collision Enable |
사용처 | 총알 궤적, 커서 아래 Hit, 포탈에 캐릭터 Overlap 등 | 자동차 움직임, 수류탄 투척, 중력 등 |
성능 | 가벼움 | 무거움 |
AddActorWorldOffset 등의 함수를 호출할 때 Sweep이라는 bool값을 매개변수로 전달할 수 있는데, 이것은 Query 시스템과 관련된 것이다.
true로 넘기면 Query 여부를 Collision의 사전 설정 (Ignore, Overlap, Block)에 따라 검사하고, false로 넘기면 검사 자체를 생략한다.
말이 나왔으니 Collision의 사전 설정에 대해서도 이야기해보자.
표를 보는 게 더 쉬울 것 같다.
액터 A👇/ 액터B👉 | Ignore | Overlap | Block |
---|---|---|---|
Ignore | 이벤트 없음 | 이벤트 없음 | 이벤트 없음 |
Overlap | 이벤트 없음 | Overlap 이벤트 발생 | Overlap 이벤트 발생 |
Block | 이벤트 없음 | Overlap 이벤트 발생 | Block 이벤트 발생 |
Block < Overlap < Ignore의 우선순위를 가진다고 생각하면 편할 것 같다.
재밌는 점은 ProjectileMovement를 사용할 때, Simulating Physics를 false로 설정해도 Should Bounce를 true로 설정하면 Block됐을 때 마치 물리 시스템으로 작동하는 것처럼 튕겨나가기도 한다.
재밌나? 사실 헷갈려 죽겠다.
막상 개발할 땐 직접 설정 바꿔서 부딪혀본 다음 '아~ 맞다.' 하고 개발을 진행하곤 한다.
확실한 점은 Query보다 Physics가 더 무겁다는 것이며, 가능하다면 최적화를 위해 Query만 사용하는 게 좋다.
근데 3D 게임에선 보통 둘 다 필요할 때가 많긴 하다.