Is it possible if yes how can I get the mouse position within an actor class in c++ ?
Hi! Tseno. Check this:
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (GetWorld())
{
FVector2D pos;
GetWorld()->GetGameViewport()->GetMousePosition(pos);
//GetWorld()->GetFirstLocalPlayerFromController()->ViewportClient->GetMousePosition(pos);
UE_LOG(LogTemp, Warning, TEXT("x:%f y:%f"), pos.X, pos.Y);
if (GEngine)
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Blue, FString::Printf(TEXT("x:%f y:%f"), pos.X, pos.Y));
}
}
Hope this helps!
Hi Andrew
I managed to do it myself like this including the Engine.h file
FVector2D mouse_coordinates;
GEngine->GameViewport->GetMousePosition(mouse_coordinates);
Which also works, but now looking at your code I’m not sure if its the best way to do it, thanks a for the help!
Also another thing, do you know how to implement mouse input from inside the actor? Currently i’m including Windows.h and using GetAsyncKeyState(VK_LBUTTON) to determine if mouse left click has occurred just because it’s easy. (And to be honest am wondering if I should leave it like that because I’m not worried about compatibility)
Hi Tseno. If you don’t care about crossplatform development you can use WinAPI.
But maybe you need clicked (Mouse Left) on actor-cube in game:
-
First create custom PlayerController (BP or C++) and in MouseInterface check Enable Click Events
https://docs.unrealengine.com/en-US/…seControlSetup -
MyGameBaseMode.cpp find and set custom PlayerController:
AMyGameBaseMode::AMyGameBaseMode()
: Super()
{
static ConstructorHelpers::FClassFinder<APlayerController> PlayerControllerClassFinder(TEXT("/Game/My_PlayerController"));
PlayerControllerClass = PlayerControllerClassFinder.Class;
};
In ProjectSettings → Maps&Modes → Default Modes → Default GameMode set MyGameBaseMode
- **MyActor.cpp **and call function (AMyActor::OnClickedCall) from dynemic multi-cast delegate
https://docs.unrealengine.com/en-US/…egates/Dynamic
void AMyActor::BeginPlay()
{
// ...
UStaticMeshComponent *CustomMeshComponent = FindComponentByClass<UStaticMeshComponent>(); // drag-drop cube in ueditor for test
if (CustomMeshComponent)
{
UE_LOG(LogTemp, Warning, TEXT("AMyActor::AMyActor CustomMeshComponent"));
CustomMeshComponent->OnClicked.AddDynamic(this, &AMyActor::OnClickedCall);
}
}
/*
UE_4.20.2/Engine/Source/Runtime/Engine/Classes/Components/PrimitiveComponent.h
line 157 about signature delegate
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( FComponentOnClickedSignature, UPrimitiveComponent*, TouchedComponent , FKey, ButtonPressed);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( FComponentOnReleasedSignature, UPrimitiveComponent*, TouchedComponent, FKey, ButtonReleased);
line 897 OnClicked, OnReleased info
Event called when the left mouse button is clicked/released while the mouse is over this component and click events are enabled in the player controller */
*/
void AMyActor::OnClickedCall(UPrimitiveComponent* TouchedComponent, FKey ButtonPressed)
{
UE_LOG(LogTemp, Warning, TEXT("AMyActor::OnClickedCall"));
}
MyActor.h
//...
#include "Runtime/Engine/Classes/Components/PrimitiveComponent.h"
#include "Runtime/Core/Public/Delegates/Delegate.h"
//...
UCLASS()
class MYPROJECTTHREAD_API AMyActor : public AActor
{
GENERATED_BODY()
//...
public:
UFUNCTION()
void OnClickedCall(UPrimitiveComponent* TouchedComponent, FKey ButtonPressed)
//...
};
**In addition **check Bindings:
https://docs.unrealengine.com/en-US/…wTo/SetUpInput
Hope this helps. Good luck!