Physical Animation Component
UPhysicalAnimationComponent로 물리 기반 이차 운동 구현하기
Physical Animation 개요
애니메이션과 물리의 결합
Physical Animation은 키프레임 애니메이션을 물리 모터(Motor)로 추적하면서, 외부 힘에 의한 자연스러운 반응을 추가하는 시스템입니다. 캐릭터가 달리다가 장애물에 부딪히면 몸이 밀리고, 걷다가 바람에 흔들리는 등의 연출이 가능합니다.
- UPhysicalAnimationComponent — Physical Animation 시스템을 관리하는 컴포넌트.
- Physical Animation Profile — 본별 모터 강도, 감쇠 등을 미리 정의한 프로파일.
- Motor Strength — 물리 바디가 애니메이션 포즈를 추적하는 강도.
- Physics Blend Weight — 물리와 애니메이션의 블렌드 비율 (0=애니메이션, 1=물리).
컴포넌트 설정
C++에서 Physical Animation 구성하기
UCLASS()
class APhysAnimCharacter : public ACharacter
{
GENERATED_BODY()
UPROPERTY(VisibleAnywhere)
UPhysicalAnimationComponent* PhysAnimComp;
public:
APhysAnimCharacter()
{
PhysAnimComp = CreateDefaultSubobject<UPhysicalAnimationComponent>(
"PhysAnimComp"
);
}
void EnablePhysicalAnimation()
{
USkeletalMeshComponent* Mesh = GetMesh();
// Physical Animation Profile 적용
PhysAnimComp->SetSkeletalMeshComponent(Mesh);
// 프로파일 이름으로 적용 (Physics Asset에서 미리 정의)
PhysAnimComp->ApplyPhysicalAnimationProfileBelow(
FName("spine_01"), // 이 본 이하에 적용
FName("Combat"), // 프로파일 이름
true // bIncludeSelf
);
// 물리 시뮬레이션 활성화
Mesh->SetAllBodiesBelowSimulatePhysics(
FName("spine_01"), true, true
);
}
};
void APhysAnimCharacter::SetupManualProfile()
{
FPhysicalAnimationData AnimData;
AnimData.bIsLocalSimulation = false;
AnimData.OrientationStrength = 1000.0f; // 방향 추적 강도
AnimData.AngularVelocityStrength = 100.0f; // 각속도 추적 강도
AnimData.PositionStrength = 1000.0f; // 위치 추적 강도
AnimData.VelocityStrength = 100.0f; // 선속도 추적 강도
AnimData.MaxLinearForce = 0.0f; // 0 = 무제한
AnimData.MaxAngularForce = 0.0f; // 0 = 무제한
// 특정 본에 수동으로 적용
PhysAnimComp->ApplyPhysicalAnimationSettings(
FName("spine_01"), AnimData
);
PhysAnimComp->ApplyPhysicalAnimationSettings(
FName("upperarm_l"), AnimData
);
PhysAnimComp->ApplyPhysicalAnimationSettings(
FName("upperarm_r"), AnimData
);
}
Physical Animation Profile
Physics Asset에서 프로파일 관리
| FPhysicalAnimationData | 설명 | 효과 |
|---|---|---|
OrientationStrength | 방향(회전) 추적 강도 | 높을수록 애니메이션 방향에 충실 |
AngularVelocityStrength | 각속도 추적 강도 | 높을수록 회전 변화에 빠르게 반응 |
PositionStrength | 위치 추적 강도 | 높을수록 애니메이션 위치에 충실 |
VelocityStrength | 선속도 추적 강도 | 높을수록 이동 변화에 빠르게 반응 |
MaxLinearForce | 최대 선형 힘 제한 | 외부 힘에 대한 저항 한도 |
MaxAngularForce | 최대 회전 힘 제한 | 외부 토크에 대한 저항 한도 |
Idle 프로파일: 높은 Strength (1500/150). 캐릭터가 애니메이션에 충실히 따름. Hit 프로파일: 낮은 Strength (200/20). 충격에 크게 반응. Dead 프로파일: Strength 0. 완전한 래그돌. 상황에 따라 프로파일을 전환하면 됩니다.
실전 활용 사례
게임에서의 Physical Animation 패턴
void APhysAnimCharacter::OnTakeHit(FVector HitDirection, float Force)
{
USkeletalMeshComponent* Mesh = GetMesh();
// 히트 지점 근처의 본에 충격량 적용
Mesh->AddImpulse(
HitDirection * Force,
FName("spine_02"),
true // bVelChange
);
// 일시적으로 Motor Strength를 낮춰 물리 반응 강화
FPhysicalAnimationData WeakData;
WeakData.OrientationStrength = 200.0f;
WeakData.PositionStrength = 200.0f;
PhysAnimComp->ApplyPhysicalAnimationSettings(FName("spine_01"), WeakData);
// 타이머로 원래 Strength 복원
GetWorldTimerManager().SetTimer(RecoveryTimer, [this]()
{
PhysAnimComp->ApplyPhysicalAnimationProfileBelow(
FName("spine_01"), FName("Combat"), true
);
}, 0.5f, false);
}
핵심 요약
UPhysicalAnimationComponent는 물리 모터로 애니메이션을 추적하면서 외부 힘에 반응하는 시스템입니다.- Physical Animation Profile로 본별 모터 강도를 미리 정의하고 상황별로 전환합니다.
- OrientationStrength/PositionStrength가 높을수록 애니메이션에 충실, 낮을수록 물리에 자유롭습니다.
- 히트 리액션: 임펄스 적용 + 모터 강도 일시 감소 + 타이머로 복원 패턴이 기본입니다.
- Physical Animation은
SetAllBodiesBelowSimulatePhysics()로 시뮬레이션 활성화가 선행되어야 합니다.
도전 과제
배운 내용을 직접 실습해보세요
캐릭터에 UPhysicalAnimationComponent를 추가하고, 상체 본(Spine, Arm, Head)에 Physical Animation 프로파일을 적용하세요. Strength와 Damping을 조정하여 물리 환경에 반응하도록 만드세요.
물리 충격을 받았을 때 해당 본에 Impulse를 적용하고, Physical Animation이 애니메이션으로 자연스럽게 복귀하는 히트 리액션을 구현하세요. 충격 강도에 따라 반응 크기가 달라지도록 하세요.
Idle, Combat, Stagger, Exhausted 4가지 상태별 Physical Animation 프로파일을 C++에서 정의하고, 게임 상태에 따라 부드럽게 전환하는 시스템을 구현하세요.