[UE5][VR] Unreal Engine 5 VR Study (7)

suhan0304·2023년 12월 3일
0

Unreal Engine 5

목록 보기
7/10
post-thumbnail

Grab Component

이제 그랩을 했을때 Grab Component를 가지고 있는 물체 탐지에 성공했다면 그 물체가 그랩되어야하므로 그랩을 진행하는 함수를 Grab Component 안에 구현한다.

Q. 왜 Grab Component에? BP Hand 안에 잡는거까지 구현 안하는 이유?
A. 이전 문서에서 언급했듯이 잡을 때 특정한 손의 위치라던가 잡고난 이후의 이벤트 처리같은 것들이 물체마다 모두 다를 수 있다. 따라서 물체의 Grab Component 안에 넣어서 물체마다 Grab을 따로 처리해주도록 한다.


물리효과 관련 함수

물체가 만약 내가 잡기 전에 물리 효과를 받고 있던 상태면 물건을 집을때 물리 효과를 없애준 다음 물건을 놓을때 물리 효과를 다시 적용 받도록 해야한다. 따라서 Grab Compenent가 부착되어있는 물체의 물리 효과를 끄고 킬 수 있는 함수와 Grab이 끝났을때 다시 물리 효과를 줄지말지를 위해 잡기 전 물체의 물리효과 상태를 저장해주는 함수가 필요하다.

1. 물리 효과 제어
다음과 같이 부모를 가져온 다음에 해당 부모의 PrimitiveComponent를 불러온 다음 물리 효과를 입력으로 들어온 값에 따라 끄고 킬 수 있는 함수를 하나 만들어준다.

Get Attach Parent : 내가 부착되어있는 Scene 컴포넌트를 불러온다.

2. 물리 효과 상태 저장
잡기 전에 부모의 물리효과를 읽어와 변수 bSimulateOnDrop에 저장하는 함수이다.


GrabType

잡기, 놓기를 구현하기 전에 그랩을 하는데 있어서 어떻게 물체를 잡을 것인지를 구별할 GrabType을 만들어주자.

enum형 블루프린트를 하나 생성해준 후 다음과 같이 설정한다.

  • Free : 손의 위치에서 물체를 바로 잡음
  • ObjToHand : 오브젝트를 원하는 위치로 끌어와 손이 특정 위치에 위치하도록 설정하여 잡음
  • HandToObj : 손을 오브젝트의 특정 위치로 보내 손이 오브젝트의 특정 위치에 위치하도록 설정하여 잡음

ObjToHand? : 총과 칼을 생각하면 쉽다. 해당 물체를 잡으면 물체들이 적절한 위치로 끌어와서 손잡이에 착하고 잡혀야한다.
HandToObj : 서랍을 생각하면 쉽다. 내가 손잡이를 잡을때 손잡이가 내 손으로 오도록 서랍이 움직이는 것이 아니라 내 손이 손잡이에 착하고 달라붙도록 내 손이 움직이는 것이다.

  • 즉, 물체를 원하는 위치에 끌어와 잡느냐, 내 손이 원하는 위치로 가서 물체를 잡느냐를 구분해주기 위한 그랩타입이다.

잡기 및 놓기 함수

잡기를 시도하거나 잡고 있던 물건을 놓을 때 실행될 TryGrab, TryRelease 함수를 생성한다.

  • GrabType의 경우 미리 생성해둔 VR GrabType형태로 선언해주고 어디서든지 수정할 수 있도록 Instance Editable을 체크해준다.

Try Grab

Free Type

컴포넌트를 다른 컴포넌트에 붙이는 Attach Component To Component를 사용해서 물체를 잡으면 해당 물체가 이어 붙어서 한 오브젝트처럼 움직이도록 한다. 따라서GrabComponent의 부모와 모션 컨트롤러를 이어 붙인다.
이어 붙이는 과정이 성공했다면 성공했다고 알려줘야하기 때문에 bHeld라는 변수를 True로 설정해준다.

BP Gun의 SkeletalMesh를 DefaultSceneRoot에 끌어다 놓아서 해당하는 Mesh 자체가 물체가 되도록 설정해주었다.

ObjToHand
다음 문서를 참고하자.

HandToObj
다음 문서를 참고하자.


잡기가 끝났으면 잡는데 성공했는지를 bHeld 변수를 확인하고 잡는데 성공했다면 Grabbing Hand에 현재 Hand를 설정, 잡지 못했으면 Null로 설정해준다.

이제 마지막으로 Held를 그대로 Success란 이름으로 넘겨서 잡았는지 못잡았는지 여부를 알려준다.


Try Release

Free Type

TryGrab의 FreeType와 정반대로 구현하면 된다 Attach 대신 Detach를 써서 GrabComponent의 부모로부터 떨어뜨리고 Held 상태를 False로 설정해준다. 이제 기존에 저장해둔 물리 효과를 매개변수로 넘겨줘서 물리 효과를 복원시킨다.

ObjToHand
다음 문서를 참고하자.

HandToObj
다음 문서를 참고하자.


HandleGrab

FindGrabComponentNearHand 함수로부터 내 손 주변에 잡을 수 있는 물체를 반환받는다. 만약 물체가 있다면 TryGrab을 시도한다. 시도했을때 Success, 즉 성공했다고 반환이 돌아오면 잡은 물체를 Held Component라고 저장한다.

아래에 있는 노드들은 저번에 구현해둔 애니메이션 파트이다. 따로 설명은 생략한다.


HandleRelease

Release를 한다면 일단 내가 잡고있는 물건이 있는지 Held Component를 확인한다. 만약 잡고 있는 물건이 있다면 잡고 있는 물건을 매개변수로 넘겨 Try Release를 해서 물건을 detach하도록 해준다.


테스트

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글