Overview
I will show you how to use simple Physical Animation in Unreal Engine 5. We start with the minimal required setup and add some simple features step by step. I will use Blueprints for this tutorial since it’s easier to copy and paste the code.
Setup
Create the Third-Person sample as a C++ or Blueprint-only project. Open the BP_ThirdPersonCharacter Blueprint and add the PhysicalAnimation component to the character.


Delete the “Event Tick” and “Begin Play” Event. Now copy & paste the Blueprint from below. The variables should contain the following values.
BoneName | Pelvis |
Physics Blend Weight | 1.0 |
ShouldBlendBack | false |
The simulation will be applied to all bones below the bone name. Below means, all bones attached as children to the named bone in the skeletal mesh asset. The pelvis is, in this example, the root bone. One can select to include or exclude the named bone. In this example, we exclude the pelvis bone.
It should now look like this, and you could stop the tutorial here and just explore the provided Blueprint.
Physical Animation Settings
As the next step, we can add Physical Animation Settings. The settings will be applied to the physical asset of the character. You can find the asset by selecting the character mesh and searching under details for the physical asset. This allows us to control the physical behavior of the character. The snippet should also be available in the Blueprint from above.

Let’s have a look at the values.
Is Local Simulation
Decides if the drive targets are in local or world space. The values “Position Strength” and “Velocity Strength” are just considered in world space.
Orientation Strength
Strength to keep the orientation of the underlying animation.
Angular Velocity Strength
Strength to keep the angular velocity of the underlying animation.
Position Strength
Strength to keep the position of the underlying animation.
Velocity Strength
Strength to keep the velocity of the underlying animation.
Epic suggests the values 1000, 100, 1000, and 100, but this didn’t work for me. I use different weights, and it also depends on your desired effect.
I use the local simulation to display impacts. The global one could be handy for environmental interactions, but I am currently not using it. The video below shows the environmental impact.
Physical Animation Profile
Let’s say you need different animation settings. A sword’s impact should behave differently from a bullet’s. That’s where Animation Profiles come in handy.
First you have to create a profile.
There is a snippet in the blueprint above how to use it.
Constraints Profile
Constraints are necessary to define how far each bone can move. For example, the right hand should not reach the right elbow. We use in this example the predefined constraints from the UE5 mannequin. Similar to the physical animation profile, a code snippet is provided in the Blueprint above. Here is the documentation how to create a constraints profile.
Physics Blend Weight

By using the Physics Blend Weight, we can control how much impact the physical simulation has on the animation. This is, for example, handy if we want to stop the simulation. Instead of snapping back, we can interpolate back to the “default” position. An example is provided in the Blueprint above.
Adding Impulse
While simulating the body, we can add impulses to bones to simulate impacts. This is straight forward, and an example is provided in the Blueprint above.
C++
The C++ part could look, for example, like this. And as written, this is an example code, I would not use it like this in any project, but it should be enough to get an idea of how it works.
YourCharacter::YourCharacter(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// member variable
PhysicalAnimationComponent = CreateDefaultSubobject<UPhysicalAnimationComponent>("PhysicalAnimComp");
}
void YourCharacter::PhysicHit()
{
PhysicalAnimationComponent->SetSkeletalMeshComponent(CharacterMesh);
PhysicalAnimationComponent->ApplyPhysicalAnimationProfileBelow("pelvis", "Profile", false);
GetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
GetMesh()->SetAllBodiesBelowSimulatePhysics("pelvis", true, false);
auto const Impulse = GetActorForwardVector() * 1000.f;
GetMesh()->AddImpulse(Impulse, "head", true);
// member variables
RemainingPhysicalAnimationTime = PhysicalAnimationTime;
bIsPhysicalAnimationActive = true;
}
void YourCharacter::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
if (bIsPhysicalAnimationActive)
{
RemainingPhysicalAnimationTime = UKismetMathLibrary::FInterpTo(RemainingPhysicalAnimationTime, 0.f, DeltaSeconds, 1);
RemainingPhysicalAnimationTime -= 0.02f;
if (RemainingPhysicalAnimationTime <= 0.f)
{
RemainingPhysicalAnimationTime = 0.f;
GetMesh()->SetSimulatePhysics(false);
GetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
GetMesh()->SetAllBodiesBelowSimulatePhysics("pelvis", false, false);
bIsPhysicalAnimationActive = false;
}
else
{
GetMesh()->SetAllBodiesBelowPhysicsBlendWeight("pelvis", UKismetMathLibrary::FMin(1, RemainingPhysicalAnimationTime), false, false);
}
}
}