PART 6 · 강의 1/3

Physical Animation Component

UPhysicalAnimationComponent로 물리 기반 이차 운동 구현하기

01

Physical Animation 개요

애니메이션과 물리의 결합

Physical Animation은 키프레임 애니메이션을 물리 모터(Motor)로 추적하면서, 외부 힘에 의한 자연스러운 반응을 추가하는 시스템입니다. 캐릭터가 달리다가 장애물에 부딪히면 몸이 밀리고, 걷다가 바람에 흔들리는 등의 연출이 가능합니다.

핵심 개념
  • UPhysicalAnimationComponent — Physical Animation 시스템을 관리하는 컴포넌트.
  • Physical Animation Profile — 본별 모터 강도, 감쇠 등을 미리 정의한 프로파일.
  • Motor Strength — 물리 바디가 애니메이션 포즈를 추적하는 강도.
  • Physics Blend Weight — 물리와 애니메이션의 블렌드 비율 (0=애니메이션, 1=물리).
02

컴포넌트 설정

C++에서 Physical Animation 구성하기

C++ - Physical Animation Component 설정
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 ); } };
C++ - Physical Animation 프로파일 수동 설정
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 ); }
03

Physical Animation Profile

Physics Asset에서 프로파일 관리

FPhysicalAnimationData설명효과
OrientationStrength방향(회전) 추적 강도높을수록 애니메이션 방향에 충실
AngularVelocityStrength각속도 추적 강도높을수록 회전 변화에 빠르게 반응
PositionStrength위치 추적 강도높을수록 애니메이션 위치에 충실
VelocityStrength선속도 추적 강도높을수록 이동 변화에 빠르게 반응
MaxLinearForce최대 선형 힘 제한외부 힘에 대한 저항 한도
MaxAngularForce최대 회전 힘 제한외부 토크에 대한 저항 한도
프로파일 전환 예시

Idle 프로파일: 높은 Strength (1500/150). 캐릭터가 애니메이션에 충실히 따름. Hit 프로파일: 낮은 Strength (200/20). 충격에 크게 반응. Dead 프로파일: Strength 0. 완전한 래그돌. 상황에 따라 프로파일을 전환하면 됩니다.

04

실전 활용 사례

게임에서의 Physical Animation 패턴

C++ - 히트 리액션 구현
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); }
SUMMARY

핵심 요약

  • UPhysicalAnimationComponent는 물리 모터로 애니메이션을 추적하면서 외부 힘에 반응하는 시스템입니다.
  • Physical Animation Profile로 본별 모터 강도를 미리 정의하고 상황별로 전환합니다.
  • OrientationStrength/PositionStrength가 높을수록 애니메이션에 충실, 낮을수록 물리에 자유롭습니다.
  • 히트 리액션: 임펄스 적용 + 모터 강도 일시 감소 + 타이머로 복원 패턴이 기본입니다.
  • Physical Animation은 SetAllBodiesBelowSimulatePhysics()로 시뮬레이션 활성화가 선행되어야 합니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Physical Animation Component 기본 설정

캐릭터에 UPhysicalAnimationComponent를 추가하고, 상체 본(Spine, Arm, Head)에 Physical Animation 프로파일을 적용하세요. Strength와 Damping을 조정하여 물리 환경에 반응하도록 만드세요.

실습 2: 히트 리액션 시스템

물리 충격을 받았을 때 해당 본에 Impulse를 적용하고, Physical Animation이 애니메이션으로 자연스럽게 복귀하는 히트 리액션을 구현하세요. 충격 강도에 따라 반응 크기가 달라지도록 하세요.

심화 과제: 상황별 Physical Animation 프로파일

Idle, Combat, Stagger, Exhausted 4가지 상태별 Physical Animation 프로파일을 C++에서 정의하고, 게임 상태에 따라 부드럽게 전환하는 시스템을 구현하세요.