Physics Asset으로 Rope Simulation

김지윤·2025년 3월 2일

UE5_MultiplayerShooter

목록 보기
17/25
post-thumbnail

이건 현재 SMG에 적용된 피직스 에셋이다.
보면 총구 아래 스트랩에 물리 적용이 이루어지지 않은 걸 볼 수 있다.
강의에선 이걸 흔들리게 하고 싶다고 한다.
Anim Dynamics를 사용해도 같은 결과를 얻을 수 있다곤 하는데, 이건 AnimBP에서 쓸 수 있는 방법이기 때문에 이런 무기에선 쓸 수 없다.

피직스 에셋이 적용되어있는 스켈레탈 메쉬로 가보면, 스트랩에 본이 적용된 걸 볼 수 있다.
이걸로 구현한다.

원하는 메쉬 우클릭 -> Create -> Physics Asset -> Create and Assign

Create Body for All Bones 체크 (중요)

그럼 이런 에셋이 만들어지는데, 이렇게까진 필요없다.
필요없는 캡슐들을 제거,

스켈레톤 트리에서 Add Shape로 Box를 여러 개 추가한 뒤 사이즈를 조절해서

이렇게 만들었다.
이건 상당히 중요한 과정이다.
무기를 바닥에 떨어트렸을 때 이 피직스 에셋을 기반으로 물리 시뮬레이션을 하기 때문에 꼭 비슷한 모양으로 만들어줘야 한다.
모든 메쉬에 대해 세세하게 만들어줄 수도 있겠지만, 그렇게 해봤자 크게 이득보는 건 없으니까 그냥 여기까지만 하자.

그 다음 스트랩의 첫 번째 본을 제외하고, 그 아래에 매달린 본들의 피직스 설정을 위와 같이 바꿔줬다.

// Weapon.h
UPROPERTY(EditAnywhere)
bool bNeedPhysicsSimulate = false;

// Weapon.cpp
void AWeapon::OnRep_WeaponState()
{
	switch (WeaponState)
	{
	case EWeaponState::EWS_Equipped:
    
    	...
        
		if (bNeedPhysicsSimulate)
		{
			WeaponMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
			WeaponMesh->SetEnableGravity(true);
			WeaponMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
		}
		break;
	case EWeaponState::EWS_Dropped:
    
    	...
        
		WeaponMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Block);
		WeaponMesh->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Ignore);        
		WeaponMesh->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
		break;
	}
}

피직스 시뮬레이트가 필요한 무기인지 확인하는 bool을 하나 선언, 해당 값이 true면 무기를 착용한 경우에도 QueryAndPhysics와 중력을 적용했다.
단, 총알을 튕겨내진 못 하도록 CollisionResponse를 Ignore로 설정했으며
떨어뜨렸을 경우 원래대로 돌려야 하므로, Pawn과 Camera에 대해서만 충돌을 무시하고 나머진 모두 Block하게 재설정했다.

서버, 클라 모두 잘 작동하고, 죽어서 떨어뜨렸을 때 등 모든 상황에서 적절하게 작동하는 걸 확인했다.
자칫 잘못 설정하면 캐릭터가 떨어진 총을 발로 차거나 카메라를 가로막아 갑작스럽게 확대되는 등 원치 않는 현상이 발생할 수 있으므로 주의하자.

profile
공부한 거 시간 날 때 작성하는 곳

0개의 댓글