Problem with BindAction()

this error showed up on build:

2>C:\Users\desik\OneDrive\Desktop\TheSevenSins\Source\TheSevenSins\Private\AzazelNokidoKait.cpp(87): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or parenthesized function-style cast
2>C:\Program Files\Epic Games\UE_5.0\Engine\Source\Runtime\Engine\Classes\Components\InputComponent.h(870): note: see declaration of 'UInputComponent::BindAction'
2>C:\Users\desik\OneDrive\Desktop\TheSevenSins\Source\TheSevenSins\Private\AzazelNokidoKait.cpp(87): note: while trying to match the argument list '(const char [11], EInputEvent, AAzazelNokidoKait *, void (__cdecl AAzazelNokidoKait::* )(std::string))'

I checked the official documentation and how I wrote it is how it works, here’s the code:

check(PlayerInputComponent);
PlayerInputComponent->BindAction("Attack Bottom", IE_Pressed, this, &AAzazelNokidoKait::Bottom);
PlayerInputComponent->BindAction("Attack Right", IE_Pressed, this, &AAzazelNokidoKait::Right);
PlayerInputComponent->BindAction("Attack Left", IE_Pressed, this, &AAzazelNokidoKait::Left);
PlayerInputComponent->BindAction("Attack Top", IE_Pressed, this, &AAzazelNokidoKait::Top);

It’s apparently saying that “ACharacter” needs to be the class called in the 4th parameter, but the method needed for this to work doesn’t exist there. Any way I can fix this?

Does the class AAzazelNokidoKait inherit from ACharacter?

It should look something like this

UCLASS()
class AAzazelNokidoKait : public ACharacter{
//.......
}

It does

This compiles no problems. Do you have all of your functions implemented on the cpp side?

.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AzazelNokidoKait.generated.h"

UCLASS()
class YOUR_API AAzazelNokidoKait : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AAzazelNokidoKait();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

	void Top();
	void Bottom();
	void Left();
	void Right();

};

.cpp

#include "AzazelNokidoKait.h"

// Sets default values
AAzazelNokidoKait::AAzazelNokidoKait()
{
	PrimaryActorTick.bCanEverTick = true;
}

void AAzazelNokidoKait::BeginPlay()
{
	Super::BeginPlay();	
}

void AAzazelNokidoKait::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

void AAzazelNokidoKait::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	check(PlayerInputComponent);
	PlayerInputComponent->BindAction("Attack Bottom", IE_Pressed, this, &AAzazelNokidoKait::Bottom);
	PlayerInputComponent->BindAction("Attack Right", IE_Pressed, this, &AAzazelNokidoKait::Right);
	PlayerInputComponent->BindAction("Attack Left", IE_Pressed, this, &AAzazelNokidoKait::Left);
	PlayerInputComponent->BindAction("Attack Top", IE_Pressed, this, &AAzazelNokidoKait::Top);
}


void AAzazelNokidoKait::Top() {
};
void AAzazelNokidoKait::Bottom() {
};
void AAzazelNokidoKait::Left() {
};
void AAzazelNokidoKait::Right() {
};

Yes i do

Here are the entire code files:
.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include <string>
#include <iostream>
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AzazelNokidoKait.generated.h"

UCLASS(config=game)
class THESEVENSINS_API AAzazelNokidoKait : public ACharacter
{
	GENERATED_BODY()

	/** Camera boom positioning the camera behind the character */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USpringArmComponent* CameraBoom;

	/** Follow camera */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class UCameraComponent* FollowCamera;
public:
	// Sets default values for this character's properties
	AAzazelNokidoKait();

	/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Input)
	float TurnRateGamepad;

	//statistics
	UPROPERTY(EditAnywhere, Category = Statistics)
	int maxHealth;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int health;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int strength;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int defense;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int magic;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int work;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int workPer;
	UPROPERTY(EditAnywhere, Category = Statistics)
	int awareness;
protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	/** Called for forwards/backward input */
	void MoveForward(float Value);

	/** Called for side to side input */
	void MoveRight(float Value);

	/**
	 * Called via input to turn at a given rate.
	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
	 */
	void TurnAtRate(float Rate);

	/**
	 * Called via input to turn look up/down at a given rate.
	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
	 */
	void LookUpAtRate(float Rate);

	//attacks
	void Bottom(std::string Weapon);
	void Right(std::string Weapon);
	void Left(std::string Weapon);
	void Top(std::string Weapon);
public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
	
	/** Returns CameraBoom subobject **/
	FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
	/** Returns FollowCamera subobject **/
	FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }

};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "AzazelNokidoKait.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include <string>
#include <iostream>

// Sets default values
AAzazelNokidoKait::AAzazelNokidoKait()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);

	// set our turn rate for input
	TurnRateGamepad = 50.f;

	// Don't rotate when the controller rotates. Let that just affect the camera.
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

	// Configure character movement
	GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...	
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); // ...at this rotation rate

	// Note: For faster iteration times these variables, and many more, can be tweaked in the Character Blueprint
	// instead of recompiling to adjust them
	GetCharacterMovement()->AirControl = 0.35f;
	GetCharacterMovement()->MaxWalkSpeed = 500.f;
	GetCharacterMovement()->MinAnalogWalkSpeed = 50.f;
	GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;

	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 400.0f; // The camera follows at this distance behind the character	
	CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

	// Create a follow camera
	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
	FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

	// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
	// are set in the derived blueprint asset named ThirdPersonCharacter (to avoid direct content references in C++)

	//statistics
	maxHealth = 750;
	health = 750;
	strength = 100;
	defense = 100;
	magic = 100;
	work = 0;
	workPer = 0;
	awareness = 50;
}

// Called when the game starts or when spawned
void AAzazelNokidoKait::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AAzazelNokidoKait::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// Called to bind functionality to input
void AAzazelNokidoKait::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
	check(PlayerInputComponent);
	PlayerInputComponent->BindAction("Attack Bottom", IE_Pressed, this, &AAzazelNokidoKait::Bottom);
	PlayerInputComponent->BindAction("Attack Right", IE_Pressed, this, &AAzazelNokidoKait::Right);
	PlayerInputComponent->BindAction("Attack Left", IE_Pressed, this, &AAzazelNokidoKait::Left);
	PlayerInputComponent->BindAction("Attack Top", IE_Pressed, this, &AAzazelNokidoKait::Top);

	PlayerInputComponent->BindAxis("Move Forward / Backward", this, &AAzazelNokidoKait::MoveForward);
	PlayerInputComponent->BindAxis("Move Right / Left", this, &AAzazelNokidoKait::MoveRight);

	// We have 2 versions of the rotation bindings to handle different kinds of devices differently
	// "turn" handles devices that provide an absolute delta, such as a mouse.
	// "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick
	PlayerInputComponent->BindAxis("Turn Right / Left Mouse", this, &APawn::AddControllerYawInput);
	PlayerInputComponent->BindAxis("Turn Right / Left Gamepad", this, &AAzazelNokidoKait::TurnAtRate);
	PlayerInputComponent->BindAxis("Look Up / Down Mouse", this, &APawn::AddControllerPitchInput);
	PlayerInputComponent->BindAxis("Look Up / Down Gamepad", this, &AAzazelNokidoKait::LookUpAtRate);
}

void AAzazelNokidoKait::TurnAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerYawInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

void AAzazelNokidoKait::LookUpAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerPitchInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

void AAzazelNokidoKait::MoveForward(float Value)
{
	if ((Controller != nullptr) && (Value != 0.0f))
	{
		// find out which way is forward
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get forward vector
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		// add movement in that direction
		AddMovementInput(Direction, Value);
	}
}

void AAzazelNokidoKait::MoveRight(float Value)
{
	if ((Controller != nullptr) && (Value != 0.0f))
	{
		// find out which way is right
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get right vector 
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		// add movement in that direction
		AddMovementInput(Direction, Value);
	}
}

void AAzazelNokidoKait::Bottom(std::string Weapon)
{

}

void AAzazelNokidoKait::Right(std::string Weapon)
{

}

void AAzazelNokidoKait::Left(std::string Weapon)
{

}

void AAzazelNokidoKait::Top(std::string Weapon)
{

}

Your error comes from the fact you are using the std library with unreal commands.

Get rid of

#include <string>
#include <iostream>

Unreal has its own string equivalent types
FString, FName, FText etc

Example changes

	void Right(FString Weapon);
	void Left(FString Weapon);
	void Top(FString Weapon);

done, but now this shows up when I hover over the function:
image
I didn’t change anything in BindAction() btw

The change of function arguments has to be on both the header file definicion (.h) and cpp file

they are
image
image
and that still appears

Ok i just remembered you cant bindaction functions with passed in parameters!

You have to some work arounds with delegates.

You could go the easier route and just have a uproperty string with the active weapon that you could use in a parameterless function, the use this variable within the attack method.

That i will do, thank you for the information