UE5 CollisionPreset(Collision Profile) 의 이해

에크까망·2024년 9월 21일

들어가기 전에

  • 단순화하기 위해서 문체를 단정적으로 사용하지만 지극히 개인 의견일 뿐입니다.
  • 본문과 관련해서 오류 지적이나 의견이 있으시면 꼭 댓글 부탁드립니다.
  • 글 작성 시점은 2024/09입니다.
  • 글 작성 기준은 UE5.4.4입니다.

들어가며

문서1, 문서2를 먼저 살펴보고 오시기 바랍니다.

여러분은 아마 숱하게 많은 UnrealEngine Collision 문서나 강좌들을 보셨을 것입니다. 그런데 대부분 뭔가 좀 찝찝하지 않으셨을까 싶습니다. 맞긴 맞는데 적용해 보면 뭔가 안 맞고, 이해했는데 뭔가 애매하고 하는 그런 느낌적인 느낌들. 지금 그 찝찝함을 날려 보겠습니다(라고 하지만 필자도 돌아서면 가끔 헷갈립니다).

이 문서의 내용은 여러분이 기본적인 UE Collision Presets(Profile)을 다뤄보셨고 최소한의 이해가 있음을 가정하지만, 없어도 큰 문제는 없습니다. 보고 나서 나중에 적용할 때 떠올릴 수 있으면 충분할 것입니다. 여기서는 ObjectType에 초점을 맞추겠습니다.

Collision Preset 상호 작용

Collision Preset은 크게 두 부분으로 나누어져 있다고 생각하셔야 합니다.

  • 남이 날 뭐라고 인식하느냐 하는 ObjectType
  • 내가 남의 ObjectType에 어떻게 반응할 것인가 하는 Collision Response ObjectType(Filter)
  • CollisionResponse 아래에 있는 ObjectType 'Ignore/Overlap/Block'은 Preset 자체의 ObjectType과는 무관하다는 것을 잊어서는 안 됩니다.

하나의 Collision Preset 내에서 ObjectType과 CollisionResponse-ObjectType은 서로 아무런 영향을 주지 않습니다. 오직 '남이 날 무엇으로 볼 것인가?'와 '내가 남을 어떻게 받아들일 것인가?'만 있습니다. ObjectType이 어떻게 바뀌어도 CollisionResponse에 영향을 주지 않고, 그 역도 마찬가지입니다.

충돌 결과를 생각해 볼 때도 두 개로 나누어서 이렇게 생각해 보시기 바랍니다.

  1. 일단 내 ObjectType은 머리에서 지웁니다.
  2. 그리고 남의 ObjectType에 내가 어떻게 반응 CollisionResponse-To-ObjectType(Ignore, Overlap, Block)하는지 계산합니다.
  3. 남의 입장에서 똑같이 계산합니다.

그 결과로 내가 남을 'Ignore, Overlap, Block' 하는지와 남이 날 'Ignore, Overlap, Block' 하는지 각각 결정하게 되고, 최종 상호 작용은 다음과 같이 됩니다.

  • 내가 남을 Ignore(무시)하면 남이 날 어떻게 봐도 쌍방 Ignore(무시)입니다.
  • 내가 남을 Overlap(Event 감지)으로 처리하면 남이 날 무시하지 않으면 쌍방 Overlap입니다.
  • 내가 남을 Block 처리하고 남도 날 Block 처리하면 쌍방 Block입니다.

쌍방이 최종 결과적으로 다르게 처리되는 경우는 없습니다. 생각해 보면 당연합니다. 남이 유령이고 내가 사람인데 유령은 날 관통하는데 난 유령을 관통하지 못한다면? 내가 움직일 때 찡겨(stuck)버릴 것입니다.

결과적으로 일종의 우선순위가 생기게 됩니다. Ignore > Overlap > Block

자 그럼 게임을 시작해 보겠습니다

Case 1

  • PresetA ObjectType : Pawn
  • PresetA CollisionResponse_To_ObjectType-Pawn : Overlap
  • PresetB ObjectType : Pawn
  • PresetB CollisionResponse_To_ObjectType-Pawn : Block

충돌 결과는? Overlap

Case 2

  • PresetA ObjectType : Pawn
  • PresetA CollisionResponse_To_ObjectType-Pawn : Ignore
  • PresetB ObjectType : Pawn
  • PresetB CollisionResponse_To_ObjectType-Pawn : Block

충돌 결과는? Ignore

Case 3

  • PresetA ObjectType : Pawn
  • PresetA CollisionResponse_To_ObjectType-Wall : Block
  • PresetB ObjectType : Wall
  • PresetB CollisionResponse_To_ObjectType-Pawn : Block

충돌 결과는? Block

걸어 다니는 유령을 만들려면?

Preset-GhostPawn이라는 Preset이 있고 이 Preset이

  • Preset-GhostPawn ObjectType : Pawn
  • Preset-GhostPawn CollisionResponse_To_ObjectType-Pawn : Ignore

이면 무슨 의도인 걸까요? 내 ObjectType이 Pawn이고 다른 ObjectType-Pawn에 대해 Ignore이니, ObjectType-Pawn인 다른 Preset에서 어떻게 반응해도 최종 결과는 Ignore일 텐데요. 그냥 CollisionEnabled를 꺼버리는 것과 다를 게 있을까요?

이것은 걸어 다니는 유령을 만들 때 사용해야 합니다. Preset-Floor는 이렇게 되어 있을 것입니다.

  • Preset-Floor ObjectType : StaticMesh
  • Preset-Floor CollisionResponse_To_ObjectType-Pawn : Block

물론 Preset-GhostPawn은 이렇게 되어 있어야 합니다.

  • Preset-GhostPawn ObjectType : Pawn
  • Preset-GhostPawn CollisionResponse_To_ObjectType-Pawn : Ignore
  • Preset-GhostPawn CollisionResponse_To_ObjectType-StaticMesh : Block

Q) 그럼 Preset-Pawn은 GhostPawn에 대해서는 어떻게 설정해야 할까요?
A) GhostPawn이란 ObjectType은 없으니 GhostPawn에 대해서 설정할 것은 없습니다.

  • Preset-Pawn ObjectType : Pawn
  • Preset-Pawn CollisionResponse_To_ObjectType-Pawn : Block
  • Preset-Pawn CollisionResponse_To_ObjectType-StaticMesh : Block

주의

ObjectType은 개수 제한이 있습니다

꼭 필요하지 않으면 ObjectType을 추가하지 말고 Preset으로 해결해 보시기 바랍니다.

Preset 이름과 ObjectType 이름을 헷갈리지 마세요

Preset 이름은 Preset 이름일 뿐입니다. ObjectType-Name과 아무 관련이 없습니다. 개수 제한도 받지 않습니다. Preset 이름인 Pawn을 떠올릴 때는 항상 '프리셋폰', '프리셋폰' 하고 '오브젝트타입폰', '오브젝트타입폰'과 구분해서 생각하시기 바랍니다. 이것은 의외로 많이들 혼동하는 부분입니다.

profile
Game Client Programmer

0개의 댓글