Unreal Engine/기능 구현 / / 2025. 6. 17. 14:15

[Unreal Engine 5] 오브젝트 잡기(Grab)

 

# Physics Handle Component

 

1. 플레이어에 피직스 핸들 컴포넌트를 추가한다.

 

 

2. GetWorld()->SweeepSingleByChannel() 함수를 충돌 대상을 탐색한다.

- 이 때 해당되는 '트레이스 채널'이 '블록'으로 체크되어 있는 충돌체만 포함된다.

 

 

 

3. 충돌체가 존재하면 피직스 핸들 컴포넌트로 잡을 수 있게 GrabComponentAtLocationWithRotation() 함수를 호출한다.

 

++ 예외처리

언리얼 물리 엔진은 일정 시간 움직이지 않은 대상의 물리 연산을 하지 않는 Sleep 상태로 바꾸는데, 이 상태에서 충돌이나 힘이 가해져도 물리 연산이 정상적으로 동작하지 않는 문제가 발생한다.

이를 해결하기 위해 강제로 Sleep 상태를 깨우는 WakeAllRigiedBodies()를 사용한다.

 

 

 

4. 플레이어가 이동 중에도 위치가 동기화 될 수 있도록 ComponentTick()에서 위치를 매 프레임 갱신한다.

 

 

 

※ 주의사항

- 아래 세 가지  모두 충족되지 않으면 대상을 잡을 수 없다.

 

1. C++ 코드에서 설정된 트레이스 채널과 오브젝트의 트레이스 반응이 '오버랩' 또는 '블록'이어야 한다.

 

# C++에서 트레이스 채널 찾기

Config 폴더에 "DefaultEngine.ini" 파일을 열고 

Ctrl + F로 "Grabber" 트레이스 채널을 검색하면 채널 값을 알 수 있다.

여기서 채널이 ECC_게임 트레이스 채널 2번이라고 나와있고, 이걸 그대로 복사해서 매개변수로 넣어준다.

 

 

 

 

2. 잡을 대상의 '모빌리티'가 '무버블'로 선택되어 있어야 한다.

 

 

3. 오브젝트의 피직스 시뮬레이트가 활성화되어 있어야 한다.

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유