Greetings, I’ve run into a problem into which I’ve spent around 6 hours without a solution, and after various tests my conclusion is that the function/node CalculateDirection doesn’t work properly inside Animation Blueprints.
For context, I’m trying to make an enemy character (AI Controller) move in circles around the player, while playing a strafe animation. The movement is working correctly, but the animation don’t match it.
I’ve already set up a blendspace which controls the logic of the animation, which can be seen here:
All the animations blend correctly given the speed and direction.
However, I noticed in game that the animation just played forward motion, never using the strafe animation.
I’m using a custom C++ class that inherits from UAnimInstance, and inside a method I update the variables used by the blendspace like this:
void UEnemyCharacterAnimInstance::UpdateAnimationProperties()
{
if (Pawn == nullptr)
{
Pawn = TryGetPawnOwner();
}
if (Pawn)
{
// Only take into account movement speed when in the ground, disregard speed in Z axis
FVector Speed = Pawn->GetVelocity();
FVector LateralSpeed = FVector(Speed.X, Speed.Y, 0.0f);
MovementSpeed = LateralSpeed.Size();
// Determine where the direction is relative to the forward vector
MovementDirection = UKismetAnimationLibrary::CalculateDirection(Speed, Pawn->GetActorRotation());
if (Enemy == nullptr)
{
Enemy = Cast<AEnemyCharacter>(Pawn);
}
}
}
Then, since it isn’t working, I decided to check by logging the obtained values from the Animation Blueprint, using the following logic:
And certainly, it always returns a MovementDirection value of 0.
Since this seemed weird, I thought maybe the C++ implementation was broken, so I tried by doing the same logic directly in blueprints like this (only testing Direction as Speed is working correctly):
Unfortunately, it also logs a value of 0 as a result.
Since I am pretty sure the logic is correct, I calculated and logged the exact same values, but this time directly in the Tick function from the EnemyCharacter, like this:
void AEnemyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector Speed = GetVelocity();
FVector LateralSpeed = FVector(Speed.X, Speed.Y, 0.0f);
float MoveSpeed = LateralSpeed.Size();
UE_LOG(LogTemp, Warning, TEXT("Speed: %f"), MoveSpeed);
float MovementDirection = UKismetAnimationLibrary::CalculateDirection(Speed, GetActorRotation());
UE_LOG(LogTemp, Warning, TEXT("Direction: %f"), MovementDirection);
}
And lo and behold, this time in the log it can be seen that it IS calculating the correct value.
The full log is this:
I’m baffled as to why this happens, I don’t get why the calculated value would be different when called directly from the Character and when called from an AnimInstance/Animation Blueprint.
For now I’ve decided to just leave the animations broken and continue with game logic as I’ve wasted a lot of time in this, but if someone has any ideas as to why this happens and how to fix it, I’ll be extremely happy
if not, at least maybe someone with my same problem can see this and save themselves hours of frustration.
Cheers!