简体   繁体   中英

Crash when trying to change the TargetArmLength (Unreal Engine C++)

It crashes anytime I'm trying to change SpringArmComponent->TargetArmLength , even if I do this: UE_LOG(LogTemp, Warning, TEXT("%f"), SpringArmComponent->TargetArmLength);

What am I doing wrong?

It crashes in the ZoomIn() and ZoomOut() functions, but it works in the constructor. If I do only SpringArmComponent->TargetArmLength it won't crash, but it does if I try to log it.

.h file fragment:

class UCameraComponent;
class USpringArmComponent;

UCLASS()
class WELT_API ATPWBaseCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
    UCameraComponent* CameraComponent;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
    USpringArmComponent* SpringArmComponent;

public:
    // Sets default values for this character's properties
    ATPWBaseCharacter(const FObjectInitializer& ObjInit);

protected:
    virtual void BeginPlay() override;

public: 
    virtual void Tick(float DeltaTime) override;

    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

    UFUNCTION(BlueprintCallable, Category = "Movement")
    bool IsRunning() const;

private:
    bool WantsToRun = false;
    bool IsMovingForward = false;

    void MoveForward(float Amount);
    void MoveRight(float Amount);

    void OnStartRunning();
    void OnStopRunning();

    void LookUp(float Amount);
    void TurnAround(float Amount);
    
    void ChangeCameraLen(bool bAmount);

public:
    UFUNCTION(BlueprintCallable, Category = "Movement")
    void ZoomIn();
    UFUNCTION(BlueprintCallable, Category = "Movement")
    void ZoomOut();
};

.cpp file fragment:

ATPWBaseCharacter::ATPWBaseCharacter(const FObjectInitializer& ObjInit) : 
    Super(ObjInit.SetDefaultSubobjectClass<UTPWCharacterMovementComponent>(ACharacter::CharacterMovementComponentName))
{
    PrimaryActorTick.bCanEverTick = true;

    SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComponent"));
    SpringArmComponent->SetupAttachment(GetRootComponent());
    // SpringArmComponent->SocketOffset.Set(0, 0, 80);
    SpringArmComponent->TargetArmLength = 400.0f;
    SpringArmComponent->bUsePawnControlRotation = true;

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));
    CameraComponent->SetupAttachment(SpringArmComponent, USpringArmComponent::SocketName);
    CameraComponent->bUsePawnControlRotation = false;

    bUseControllerRotationPitch = false;
    bUseControllerRotationYaw = false;
    bUseControllerRotationRoll = false;
}
void ATPWBaseCharacter::BeginPlay()
{
    Super::BeginPlay();
}
void ATPWBaseCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // AddActorLocalRotation(QuatRotation, false, 0, ETeleportType::None);
    FRotator NewRotationVector = FRotator(0.0f, GetVelocity().Rotation().Yaw, 0.0f);    // pitch, yaw, roll
    if (!NewRotationVector.IsZero())
    {
        FRotator NewRotation = FRotator(NewRotationVector);
        FQuat QuatRotation = FQuat(NewRotation);
        SetActorRotation(QuatRotation, ETeleportType::None);
    }
}
void ATPWBaseCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    PlayerInputComponent->BindAxis("MoveForward", this, &ATPWBaseCharacter::MoveForward);
    PlayerInputComponent->BindAxis("MoveRight", this, &ATPWBaseCharacter::MoveRight);
    PlayerInputComponent->BindAxis("LookUp", this, &ATPWBaseCharacter::LookUp);
    PlayerInputComponent->BindAxis("TurnAround", this, &ATPWBaseCharacter::TurnAround);

    PlayerInputComponent->BindAction("WheelUp", IE_Pressed, this, &ATPWBaseCharacter::ZoomIn);
    PlayerInputComponent->BindAction("WheelDown", IE_Pressed, this, &ATPWBaseCharacter::ZoomOut);

    PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ATPWBaseCharacter::Jump);
    PlayerInputComponent->BindAction("Run", IE_Pressed, this, &ATPWBaseCharacter::OnStartRunning);
    PlayerInputComponent->BindAction("Run", IE_Released, this, &ATPWBaseCharacter::OnStopRunning);
}

void ATPWBaseCharacter::MoveForward(float Amount)
{
    IsMovingForward = Amount > 0.0f;
    // AddMovementInput(GetActorForwardVector(), Amount);
    if ((Controller != nullptr) && (Amount != 0.0f))
    {
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);
        const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
        AddMovementInput(Direction, Amount);
    }
}

void ATPWBaseCharacter::MoveRight(float Amount)
{
    // AddMovementInput(GetActorRightVector(), Amount);
    if ((Controller != nullptr) && (Amount != 0.0f))

        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);
        const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
        AddMovementInput(Direction, Amount);
    }
}

void ATPWBaseCharacter::LookUp(float Amount)
{
    AddControllerPitchInput(Amount);
}

void ATPWBaseCharacter::TurnAround(float Amount)
{
    AddControllerYawInput(Amount);
}

void ATPWBaseCharacter::OnStartRunning()
{
    WantsToRun = true;
}
void ATPWBaseCharacter::OnStopRunning()
{
    WantsToRun = false;
}

void ATPWBaseCharacter::ZoomIn()
{
    // SpringArmComponent->TargetArmLength;
    UE_LOG(LogTemp, Warning, TEXT("%f"), SpringArmComponent->TargetArmLength);
    SpringArmComponent->TargetArmLength = 200.0f;
    // UE_LOG(LogTemp, Warning, TEXT("%f"), SpringArmComponent->TargetArmLength);
    // SpringArmComponent->SocketOffset = FVector(0, 0, 80);
}

void ATPWBaseCharacter::ZoomOut()
{
    // SpringArmComponent->TargetArmLength;
    UE_LOG(LogTemp, Warning, TEXT("%f"), SpringArmComponent->TargetArmLength);
    
    SpringArmComponent->SocketOffset = FVector(0, 0, 80);
}

Is there any chance that you are running this in a Blueprint actor that derives from this class? If so I've noticed that this can cause issues with component creation and will cause the engine to crash and return NULL for the component that is otherwise being set up properly.

I would suggest maybe trying to create a new derived class and see if that works. I know it's a strange suggestion but it worked for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM