Unreal Engine 4
http://uengine.ru/forum/

Как определить по какому мешу кликнули внутри класса APawn?
http://uengine.ru/forum/viewtopic.php?f=19&t=14696
Страница 1 из 1

Автор:  FreD_WriteR [ 14 сен 2018, 14:11 ]
Заголовок сообщения:  Как определить по какому мешу кликнули внутри класса APawn?

Есть ли в классе Pawn функционал для отслеживания событий мыши, клавиатуры по конкретному мешу внутри Pawn?
Есть Pawn, в нем определены несколько мешей, функция шаблон для OnClicked.AddDynamic, переопределенная функция для настройки контроллера:

.h
Код:
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "Components/BoxComponent.h"
#include "Components/Button.h"
#include "PlayerPawn.generated.h"


UCLASS()
class ANONIMMATHPROJECT_API APlayerPawn : public APawn
{
    GENERATED_BODY()

public:
    // Sets default values for this pawn's properties
    APlayerPawn();

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

    virtual void PossessedBy(AController* NewController) override;

    APlayerController* PlayerController;

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

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

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn")
    UBoxComponent* PawnCollision;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Pawn")
    UStaticMeshComponent* PawnPlane;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn")
    UStaticMeshComponent* PawnButton;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn")
    UStaticMeshComponent* PawnButton1;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn")
    USpringArmComponent* CamSpringArm;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn")
    UCameraComponent* PawnCamera;

    UFUNCTION()
    void OnSelecded(AActor* Target, FKey Key);
};


.cpp

Код:
// Fill out your copyright notice in the Description page of Project Settings.

#include "PlayerPawn.h"
#include "Components/StaticMeshComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/PlayerController.h"

// Sets default values
APlayerPawn::APlayerPawn()
{
    // 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;

    OnClicked.AddDynamic(this, &APlayerPawn::OnSelecded);
    PawnCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("PawnCollision"));
    SetRootComponent(PawnCollision);

    PawnButton = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PawmButton"));
    PawnButton->SetupAttachment(PawnCollision);

    PawnButton1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PawmButton1"));
    PawnButton1->SetupAttachment(PawnCollision);

    PawnPlane = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PawnPlane"));
    PawnPlane->SetupAttachment(PawnCollision);

    CamSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CamSpringArm"));
    CamSpringArm->SetupAttachment(PawnCollision);

    PawnCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("PawnCamera"));
    PawnCamera->SetupAttachment(CamSpringArm);
}

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

}


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

}


// Called to bind functionality to input
void APlayerPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

}


void APlayerPawn::OnSelecded(AActor* Target, FKey Key)
{
    UE_LOG(LogTemp, Warning, TEXT("Pawn selected"));
}



void APlayerPawn::PossessedBy(AController* NewController)
{
    APlayerController* PlayerController = Cast<APlayerController>(NewController);

    PlayerController->bShowMouseCursor = true;
    PlayerController->bEnableClickEvents = true;
    PlayerController->bEnableMouseOverEvents = true;
    PlayerController->DefaultClickTraceChannel = ECollisionChannel::ECC_Pawn;
}


Все три меша настроены в блупринтах, для примера выбраны кубы. При клике по одному из кубов в лог выводится сообщение, то есть клики работают. Как определить имя меша, по которому произошел клик? Неужели в AActor при выполнении клика нет этой информации?

Автор:  gary_cho [ 19 сен 2018, 14:01 ]
Заголовок сообщения: 

трасируй луч.. он тебе даст инфу, в какой компонент он ударился.. вроде ничего сложного

Автор:  Snake [ 19 сен 2018, 18:09 ]
Заголовок сообщения: 

у каждого меша есть свой делегат OnClicked
стандартный клик анриала смотрим в методе "virtual bool APlayerController::InputKey()" там эти делегаты вызываются.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/