jeudi 19 octobre 2023

How to get KeyPress and mouseclick to work with non Player Class

I am trying to get a non player class to respond to a key press for testing purposes and i got a working player character. I want to try and setup a MassProcessor that can take mouseclick and get position in 3D space.

But i am still new a C++ so i am unsure of i would procced.

Bellow is my current code which compiles, and i would want to execute the function UMassTestProcessor::GetCursorPosition when i leftclick on the mouse.

.CCP file

UMassTestProcessor::UMassTestProcessor()
{
    bAutoRegisterWithProcessingPhases = true;
    ExecutionFlags = (int32)EProcessorExecutionFlags::All;
    ExecutionOrder.ExecuteBefore.Add(UE::Mass::ProcessorGroupNames::Avoidance);

    MousePosition = FVector(0,0,0);
    /*
    if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
    {
        PlayerInputComponent->BindAction("LeftMouseButton", IE_Pressed, this, GetCursorPosition());


    }
    */
}

void UMassTestProcessor::ConfigureQueries()
{
    EntityQuery.AddRequirement<FTransformFragment>(EMassFragmentAccess::ReadOnly);
    EntityQuery.AddRequirement<FMassMoveTargetFragment>(EMassFragmentAccess::ReadWrite);


    EntityQuery.AddTagRequirement<FMyTag>(EMassFragmentPresence::All);

}

void UMassTestProcessor::Execute(FMassEntityManager& EntityManager, FMassExecutionContext& Context)
{


    EntityQuery.ForEachEntityChunk(EntityManager, Context, 
        ([this](FMassExecutionContext& Context)
        {
                
            const TArrayView<FTransformFragment> TransformsList = Context.GetMutableFragmentView<FTransformFragment>();
            const TArrayView<FMassMoveTargetFragment> TargetList = Context.GetMutableFragmentView<FMassMoveTargetFragment>();
            //const float WorldDeltaTime = Context.GetDeltaTimeSeconds();

            for (int32 EntityIndex = 0; EntityIndex < Context.GetNumEntities(); EntityIndex++)
            {
                FTransform& Transform = TransformsList[EntityIndex].GetMutableTransform();
                FMassMoveTargetFragment& Target = TargetList[EntityIndex];

                Target.Center = FVector(100.f, 100.f, 0.f);

                Target.Forward = (Target.Center - Transform.GetLocation()).GetSafeNormal();
                Transform.SetRotation(FQuat::FindBetweenVectors(FVector::ForwardVector,Target.Forward));

            }

        }));

}

void UMassTestProcessor::GetCursorPosition()
{
    FHitResult Hit;
    bool bHitSuccessful = false;

    if (PlayerInputComponent)
    {
        APlayerController PlayerController;
        bHitSuccessful = PlayerController.GetHitResultUnderCursor(ECollisionChannel::ECC_Visibility, true, Hit);
        UE_LOG(LogTemp, Warning, TEXT("Position is: %s"), *Hit.Location.ToString());
        MousePosition = Hit.Location;
    }



}

.H file

UCLASS()
class PROJECTMASS_API UMassTestProcessor : public UMassProcessor
{
    GENERATED_BODY()

public:
    UMassTestProcessor();

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = WorldPositionFromMouse)
    FVector MousePosition;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
    class UInputAction* PlayerInputComponent;

    //virtual void ACharacter::ACharacter SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

protected:
    virtual void ConfigureQueries() override;
    virtual void Execute(FMassEntityManager& EntityManager, FMassExecutionContext& Context) override;

    void GetCursorPosition();

private:
    FMassEntityQuery EntityQuery;
};

I would like some simple code example, that way its a lot easier for me to understand, but i would be thankful for any suggestions.

Aucun commentaire:

Enregistrer un commentaire