I want my camera spring arm to lerp between different positions depending on whether my player is walking, running, crouching etc. Using a timeline makes sense for the lerp. Running it, however, instantly causes the editor to crash. This is using version 4.23.1.
The relevant code, .h file:
// Other includes irrelevant to question
#include "Runtime/Engine/Classes/Components/TimelineComponent.h"
#include "ALSCharacter.generated.h"
UCLASS()
class CPPCHARACTERMOVEMENT_API AALSCharacter : public ACharacter
{
GENERATED_BODY()
// Timeline component for lerping camera
class UTimelineComponent* CameraTimeline;
public:
// Lerp curves required to update the camera. These need to be defined in the BP class which inherits from this class.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Lerp Curves")
class UCurveFloat* uCurveCameraAiming;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera Lerp Curves")
class UCurveFloat* uCurveCameraNotAiming;
private:
// Camera and camera lerping utility functions
void UpdateCamera(UCurveFloat* lerpCurve, float curveLength); // Updates the camera based on a Lerp curve
FCameraSettings ChooseCameraSettings(); // Returns camera settings based on movement mode, bIsAiming, stance and gait
void LerpBetweenCameraSettings(float lerpAlpha); // Lerps between the current camera settings and the desired camera settings
FOnTimelineFloat InterpFunction; // Delegate for timeline's float track
UFUNCTION() // The function which the timeline update is bound to. Effectively acts as a wrapper for
void TimelineUpdate(float value); // LerpBetweenCameraSettings(float lerpAlpha)
The relevant code, .cpp file:
//Other includes irrelevant to question
#include "ALSCharacter.h"
#include "Camera/CameraComponent.h"
#include "Runtime/Engine/Classes/Components/TimelineComponent.h"
#include "GameFramework/SpringArmComponent.h"
AALSCharacter::AALSCharacter()
{
/* CONFIGURATION OF SUBOBJECTS */
// Create a spring arm
SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
SpringArm->SetupAttachment(RootComponent);
SpringArm->TargetArmLength = 300.0f;
SpringArm->bUsePawnControlRotation = true;
// Create a camera
ThirdPersonCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
ThirdPersonCamera->SetupAttachment(SpringArm, USpringArmComponent::SocketName);
ThirdPersonCamera->bUsePawnControlRotation = false;
// Create timeline for camera lerp and bind the delegates to the appropriate functions
CameraTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("CameraTimeline"));
InterpFunction.BindUFunction(this, FName("TimelineUpdate"));
// Other things done in the constructor irrelevant to question
}
// This function is called every time the player changes gait (e.g. goes from running to walking, or walking to crouching, etc.)
void AALSCharacter::UpdateCamera(UCurveFloat* lerpCurve, float curveLength)
{
if (lerpCurve)
{
CameraTimeline->AddInterpFloat(lerpCurve, InterpFunction, FName("LerpAlpha"), FName("LerpAlpha"));
CameraTimeline->SetFloatCurve(lerpCurve, FName("LerpAlpha"));
CameraTimeline->SetTimelineLength(curveLength);
CameraTimeline->SetLooping(false);
CameraTimeline->PlayFromStart(); // <-- This is the line causing the crash. I know this, because if I comment out and recompile, no crash but also the timeline doesn't run.
}
}
void AALSCharacter::TimelineUpdate(float value)
{
//LerpBetweenCameraSettings(value); // Function which does the lerping math
UE_LOG(LogTemp, Log, TEXT("Timeline playing..."));
}
As soon as my character changes gait (e.g. I press left alt to change from running to walking), the editor freezes, crashes, and I get the following window:
So why is this happening? It’s not to do with the fact the lerp curve is invalid, because that is checked for. This is done almost exactly as it is done on the wiki. Maybe I’ve just missed something obvious… maybe this is a bug. Are there certain things which you cannot do in the constructors, which is why?