이 포스팅은 아래 강의를 들으며 작성되었습니다.
https://www.udemy.com/course/unrealcourse-korean/
PhysicsHandle
물체를 잡고 이동하고 놓는 기능을 직접 구현하지 않아도
언리얼에서 제공해주고 있다.
https://docs.unrealengine.com/5.1/en-US/API/Runtime/Engine/PhysicsEngine/UPhysicsHandleComponent/
이동도 밋밋하게 캐릭터와 동시와 움직이는 것이 아닌
용수철처럼 따라오는 느낌
구현을 위해 우선 플레이어 블루프린트에 PhysicsHandle 컴포넌트를 추가해준다.
UPrimitiveComponent* HitComponent = HitResult.GetComponent();
HitComponent->WakeAllRigidBodies();
PhysicsHandle->GrabComponentAtLocationWithRotation(HitComponent, NAME_None, HitResult.ImpactPoint, GetComponentRotation());
탐색 범위에 있는 컴포넌트를 대상으로 Grab을 시도하였다.
GrabComponentAtLocationWithRotation이라는 녀석은 프리미티브 컴포넌트, 본 이름, 위치, 회전값을 인자로 받는데
스켈레탈 메시를 사용하고 있지 않기 때문에 본 이름은 NAME_None으로 입력한다.
위의 WakeAllRigidBodies는 오랫동안 동작하지 않을 경우 리지드바디가 슬립상태에 들어가기 때문이다.
정상적인 작동을 위해 집기 전에 깨워두는 것.
당연히 집을 대상도 모빌리티를 무버블로 변경하여야 한다.
실행 도중에 transform이 바뀔 일이 있다면 전부 무버블이다.
피직스 시뮬레이션 켜는 것도 잊지 말자.
FVector TargetLocation = GetComponentLocation() + GetForwardVector() * HoldDistance;
PhysicsHandle->SetTargetLocationAndRotation(TargetLocation, GetComponentRotation());
Tick 함수 안에서는 계속 타겟의 위치와 회전값을 넣어준다.
Target의 회전값이 아닌 Grab 컴포넌트의 회전값을 넣어줌을 주의.
if(PhysicsHandle->GetGrabbedComponent() != nullptr)
PhysicsHandle->ReleaseComponent();
없앨 때는 먼저 집고있는 컴포넌트가 있는지 검사하고
Release를 호출하자.
'언리얼 > [Udemy] UE5' 카테고리의 다른 글
[언리얼] Udemy 강의 14일차 메모 (~111강) (0) | 2023.10.23 |
---|---|
[언리얼] Udemy 강의 13일차 메모 (~104강) (0) | 2023.10.18 |
[언리얼] Udemy 강의 11일차 메모 (~92강): 5.1 이후의 Input Action Mapping (0) | 2023.10.16 |
[언리얼] Udemy 강의 10일차 메모 (~85강) (1) | 2023.10.13 |
[언리얼] Udemy 강의 9일차 메모 (~79강) (2) | 2023.10.11 |