4

嘿,我一直试图在运行时单击 StaticMeshComponent,但无法单击特定的 StaticMeshComponent。我尝试了以下逻辑来单击并在 OnClick() 函数中设置材料,但无法成功。AddDynamic 方法是否正确?
在.cpp

    StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponentCOMP"));
    ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMesh_obj(TEXT("/Game/StarterContent/Meshs/Chairs_Chair1"));
    StaticMeshComponent->SetStaticMesh(StaticMesh_obj.Object);
    StaticMeshComponent->OnClicked.AddDynamic(this, &AMyActor::OnClick);
    StaticMeshComponent->AttachTo(RootComponent);

// OnClick Function


 void AMyActor::OnClick(UPrimitiveComponent* pComponent)
     {
ConstructorHelpers::FObjectFinder<UMaterial> MeshMaterial(TEXT("/Game/GTFreeMaterials/Materials/Metal_BrushedSteel"));

        // Set properties for Staic mesh component
        StaticMeshComponentArray[i]->SetMaterial(0, MeshMaterial.Object);
         FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT("Clicked")));
     }

在.h

 void OnClick(UPrimitiveComponent* pComponent);

你们能否在这个问题上帮助我或指导我任何其他有效的逻辑来解决我的问题。

PS:游戏模式:鼠标点击模式

4

1 回答 1

3

我只是进行了快速测试,一切正常。也许我使用的步骤会对您有所帮助:

1,启动UE4.18;使用 Basic Code、Desktop/Console、Maximum Quality 和 No Starter Content 创建一个新的 C++ 项目

2,添加一个Player Controller C++类并使用默认构造函数显示鼠标光标,并启用点击和鼠标悬停事件

3,打开项目生成的C++ Game Mode类,使用默认构造函数将默认的Player Controller类设置为我的新类

4,编辑Project Settings以使用C++ Game Mode类(Maps & Modes -> Default Modes -> Default GameMode)

5,添加一个新的 Pawn C++ 类,带有一个 click 函数,该函数简单地将一条消息记录到输出日志并在默认构造函数中注册该函数

6,添加一个从我的C++ Pawn类派生的蓝图类,并在其组件中添加一个Cube(Static Mesh Component),然后在它的Detail Panel中勾选“Hidden in Game” 。
或者
如果要使用角色默认的 CollisionProfilePawn来接收Clicked EventVisibility必须设置为Block(项目设置 -> 引擎 -> 碰撞 -> 预设 -> Pawn -> 跟踪类型 -> 可见性)。

在此处输入图像描述

一种严格的方法是Trace Channel为点击测试添加新的,请参阅此视频的更多详细信息:https ://www.youtube.com/watch?v=yo9VrxFgUJY

7,将我的一个蓝图Pawns放到玩家面前的场景中

8,玩关卡,点击我的蓝图Pawn类的立方体,查看Output Log,看到消息出现了

主要代码:

在 AMyCharacter 构造函数中

OnClicked.AddUniqueDynamic(this, &AMyCharacter::OnSelected);

在头文件 AMyCharacter.h

UFUNCTION()
        void OnSelected(AActor* Target, FKey ButtonPressed);

在 AMyCharacter.cpp 中

void AMyCharacter ::OnSelected(AActor* Target, FKey ButtonPressed)
{
    GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Cyan, FString("EEEEEEEEEEEEEEEEE"));
}
于 2018-01-11T07:21:00.173 回答