WakeAllRigidBodies() 물리 오브젝트 깨우기

ChangJin·2023년 11월 1일
0

Unreal Engine5

목록 보기
17/102
post-thumbnail

기존 기능에 유용한 기능 추가. 물체 잡고 던지기

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Components/UPrimitiveComponent/WakeAllRigidBodies/

물체 집기

  • 가끔 이 가고일을 집을 수 없는 이유?
    • 물리 시뮬레이션 컴포넌트가 성능상의 이유로 일정 시간동안 가동되지 않으면 슬립 상태로 들어가기 때문
    • 가고일의 물리 시물레이션이 슬립 상태가 되도 PhysicalHandle이 되어도 깨어나지 않음
    • 구체 트레이스로 히트했을 때 깨어나도록 하는 방법을 알아야 함
    • UPrimitiveCompoenet를 보아야 함.
    • Hitresult가 UPrimitiveCompoenet를 리턴함
  • UPrimitiveCompoenet
    • 프리미티브 컴포넌트는 씬 컴포넌트이며 특정 지오메트리르 포함하거나 생성하고 콜리전 데이터로 렌더링되거나 사용됨
    • 말하자면 프리미트 컴포넌트는 물리 시뮬레이션을 실행함
    • WakeAllRigidBodies()가 필요함
    • PhysicsHandle을 달 때 사용할 수 있음

물체 놓기

  • Call ReleaseCompoenet()를 해야함
    • PhysicsHandle에 접근해야함
  • GetGrabbedComponent()가 있는지 확인해야함
    • 집은 컴포넌트의 포인터를 리턴할때 PhysicsHandle이 있는지 봐야함.
    • 아무것도 가지고 있지 않다면 PhysicsHandle이 nullptr일 것임
  • 컴포넌트를 집기 전에 했던 것처럼 놓기전에 GetGrabbedComponent()를 호출하고 WakeAllRigidBodies()를 호출하는 것이 좋음.
    • 왜?? 컴포넌트를 집은 후 일정 시간 동안 움직이지 않으면 슬립상태로 들어갈 테니까.. 그런 경우에는 놓으려고 해도 아무런 일이 발생하지 않음.
void UGrabber::Release()
{
	// UE_LOG(LogTemp, Display, TEXT("Released grabber"));

	UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
	if (PhysicsHandle == nullptr)
	{
		return;
	}

	if (PhysicsHandle->GetGrabbedComponent() != nullptr)
	{
		PhysicsHandle->ReleaseComponent();
	}
	
}
  • 잘 생각해보면 무언가를 집고 있지 않다면 TickComponent에서 타깃 위치를 설정할 필요가 없음.
    • 즉 TickComponent에 동일한 if문을 추가해야함.
FVector TargetLocation = GetComponentLocation() + GetForwardVector() * HoldDistance;
PhysicsHandle->SetTargetLocationAndRotation(TargetLocation, GetComponentRotation());
if(PhysicsHandle->GetGrabbedComponent != nullptr)
	{
		FVector TargetLocation = GetComponentLocation() + GetForwardVector() * HoldDistance;
		PhysicsHandle->SetTargetLocationAndRotation(TargetLocation, GetComponentRotation());
	}
  • 근데 물체를 잡고 이동할 때 물체가 흔들리는 문제가 발생함
    • Collision에서 Custom Collision 프리셋의 Object Responses을 보면 Pawn과 충돌해야 할지 아니면 다르게 반응을 해야할지 선택이 가능함.
    • 현재는 오버랩으로 설정.

  • 충돌하지 않고 무시된다는 뜻.
  • 또한 두 개의 스태틱 메시로 구성되어 있으므로 각자 Collision 설정이 있음

  • 가고일 밑에 있는 Dirt Mound는 충돌이 없도록 설정해야함.
profile
Unreal Engine 클라이언트 개발자

0개의 댓글