Hello! I have been trying to make a custom PlayerController class, I guess it is almost done, but I have some issues. When I call GetPawn()
within this function
void Auser_control::MoveUp(float Value)
{
if (Value != 0.0f && (GetPawn() != NULL))
{
FRotator const ControlSpaceRot = GetControlRotation();
// transform to world space and add it
GetPawn()->AddMovementInput(FRotationMatrix(ControlSpaceRot).GetScaledAxis(EAxis::Y), Value);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("NULL")); //ALWAYS RETURNS NULL
}
}
GetPawn()
always returns NULL. Please any ideas what do I do wrong?
The whole code you can see down below.
In a GameMode class I set a default Pawn class and a PlayerController class. Like this:
UCLASS()
class HANDLECAMERA_API AHandleCameraGameMode : public AGameMode
{
GENERATED_BODY()
public:
AHandleCameraGameMode(const FObjectInitializer& ObjectInitializer);
};
AHandleCameraGameMode::AHandleCameraGameMode(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
DefaultPawnClass = AMyPawn::StaticClass();
PlayerControllerClass = Auser_control::StaticClass();
}
Within the PlayerController class I have next code:
UCLASS()
class HANDLECAMERA_API Auser_control : public APlayerController
{
GENERATED_BODY()
private:
UPROPERTY(VisibleDefaultsOnly, Category = "Player Controller")
USpringArmComponent* SpringArm;
UPROPERTY(VisibleDefaultsOnly, Category = "Player Controller")
UCameraComponent* Camera;
UPROPERTY(VisibleDefaultsOnly, Category = "Player Controller")
UBoxComponent* CrouchCamera;
UPROPERTY(VisibleDefaultsOnly, Category = "Player Controller")
UBoxComponent* BackCamera;
public:
Auser_control(const FObjectInitializer& ObjectInitializer);
void MoveUp(float Value);
virtual void SetupInputComponent() override;
virtual void SetPawn(APawn* InPawn) override;
};
Auser_control::Auser_control(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SpringArm = ObjectInitializer.CreateDefaultSubobject<USpringArmComponent>(this, TEXT("SpringArm"));
SpringArm->TargetArmLength = 100.f;
SpringArm->bUsePawnControlRotation = false;
SpringArm->bInheritPitch = true;
SpringArm->bInheritYaw = true;
SpringArm->bInheritRoll = true;
SpringArm->bEnableCameraLag = false;
SpringArm->bEnableCameraRotationLag = false;
Camera = ObjectInitializer.CreateDefaultSubobject<UCameraComponent>(this, TEXT("Camera"));
Camera->AttachTo(SpringArm, USpringArmComponent::SocketName);
Camera->SetRelativeLocation(FVector(0.f, 0.f, 0.f), false);
CrouchCamera = ObjectInitializer.CreateDefaultSubobject<UBoxComponent>(this, TEXT("CrouchCamera"));
SpringArm->AttachTo(CrouchCamera);
}
void Auser_control::SetPawn(APawn* InPawn)
{
Super::SetPawn(InPawn);
}
void Auser_control::SetupInputComponent()
{
Super::SetupInputComponent();
check(InputComponent);
if (InputComponent != NULL)
{
InputComponent->BindAxis("MoveUp", this, &Auser_control::MoveUp);
}
}
void Auser_control::MoveUp(float Value)
{
if (Value != 0.0f && (GetPawn() != NULL))
{
FRotator const ControlSpaceRot = GetControlRotation();
// transform to world space and add it
GetPawn()->AddMovementInput(FRotationMatrix(ControlSpaceRot).GetScaledAxis(EAxis::Y), Value);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("NULL")); //ALWAYS RETURNS NULL
}
}
And my Pawn class looks like this:
UCLASS()
class HANDLECAMERA_API AMyPawn : public APawn
{
GENERATED_BODY()
private:
UPROPERTY(VisibleDefaultsOnly, BluePrintReadOnly, meta = (AllowPrivateAccess = "true"))
class USceneComponent* DummyRoot;
UPROPERTY(VisibleDefaultsOnly, BluePrintReadOnly, meta = (AllowPrivateAccess = "true"))
class USkeletalMeshComponent* SkeletalMesh;
public:
// Sets default values for this pawn's properties
AMyPawn();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
};
AMyPawn::AMyPawn()
{
DummyRoot = CreateDefaultSubobject<USceneComponent>(TEXT("Dummy0"));
RootComponent = DummyRoot;
class USkeletalMesh* TmpSkeletalMesh;
TmpSkeletalMesh = ConstructorHelpers::FObjectFinderOptional<USkeletalMesh>(TEXT("SkeletalMesh'/Game/MixamoAnimPack/Mixamo_Vanguard/Mesh/Vanguard_by_T__Choonyung.Vanguard_by_T__Choonyung'")).Get();
SkeletalMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMesh0"));
SkeletalMesh->SetSkeletalMesh(TmpSkeletalMesh);
SkeletalMesh->AttachTo(RootComponent);
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AMyPawn::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyPawn::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
Super::SetupPlayerInputComponent(InputComponent);
}