SkeletalMesh의 Scale 조정 시, 물리가 정상적으로 작동하지 않는 문제

전지훈·2021년 5월 17일
0

Unreal

목록 보기
1/25
post-thumbnail

해당 좀비는 Spawn시 땅에서 기어나오는 애니메이션의 Frame Popping(1프레임이 튀는 문제)을 해결하기 위해 Actor의 SkeletalMesh의 Scale을 0.001로 만들었다가, 0.5초 뒤에 다시 원상복구 시키는 코드를 집어넣었는데 위와 같이 시체가 되었을 때 물리 시뮬레이션이 망가지는 현상이 발생하였다.

Scale을 KINDA_SMALL_NUMBER 즉, 0.0001 이하로 설정할 경우, Scale3D is (nearly) zero Warning이 발생하므로 주의해야 한다.

본 현상은 물리가 활성화 된 랙돌의 크기가 SkeletalMesh의 크기를 따라 작아진 이후에 SkeletalMesh의 크기가 복원 되었을 때 따라서 복원되지 않은 뒤 물리가 켜져 Scale이 줄어든 랙돌의 바디들이 무한히 충돌하며 발생하는 현상으로 보인다. (혹은 질량이 줄어든채로 복구가 안되어서 생성되는 문제 같기도 하다.)

void UActorComponent::RecreatePhysicsState()
{
	DestroyPhysicsState();

	if (IsRegistered())
	{
		CreatePhysicsState();
	}
}

위의 함수를 Scale 변경 이후, 다양한 형태의 SimulatePhysics 이전에 호출하면 해결된다. 필자는 SetAllBodiesSimulatePhysics 이전에 호출하였다.

언리얼의 PhysicsState는 실시간으로 갱신이 되는 것이 아닌 것으로 보이며, 어느 시점에 갱신이 되었는지 명확히 알기 어렵기 때문에(PostInitializeComponents, Rename 등에서 호출 됨) 실제로 물리를 적용하기 전에 호출해주어야 정상적인 실행 결과를 보장할 수 있다.

UE4 AnswerHub - Collision shape not scaling, but the mesh does?
UE4 AnswerHub - Set Collision Profile Name not working

profile
10%의 확신과 90%의 어.. 이게 왜 되지?

0개의 댓글