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개의 댓글