[英]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);
它在我尝试更改SpringArmComponent->TargetArmLength
,即使我这样做: 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.它在ZoomIn()
和ZoomOut()
函数中崩溃,但它在构造函数中工作。 If I do only SpringArmComponent->TargetArmLength
it won't crash, but it does if I try to log it.如果我只做SpringArmComponent->TargetArmLength
它不会崩溃,但如果我尝试记录它就会崩溃。
.h file fragment: .h 文件片段:
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: .cpp 文件片段:
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?您是否有可能在派生自此类的蓝图 actor 中运行它? 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.如果是这样,我已经注意到这可能会导致组件创建出现问题,并且会导致引擎崩溃并为正确设置的组件返回 NULL。
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.我知道这是一个奇怪的建议,但它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.