如何在ure4.7中为StaticMeshComponent添加OnClicked事件?

时间:2015-04-24 09:01:21

标签: c++ unreal-engine4

Hej,我一直试图在运行时点击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);

你们可以帮助我解决这个问题吗?或者指导我解决问题的另一个有效逻辑。

P.S:游戏模式:鼠标点击模式

1 个答案:

答案 0 :(得分:2)

我只是快速测试并且一切正常。也许我使用的步骤会对你有所帮助:

1,启动UE4.18;使用基本代码,桌面/控制台,最高质量和无入门内容创建新的C ++项目

2,添加一个Player Controller C ++类并使用默认构造函数,以显示鼠标光标,并启用click和mouse-over events

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

4,编辑项目设置以使用C ++游戏模式类(地图和模式 - &gt;默认模式 - &gt;默认GameMode)

5,使用单击函数添加一个新的Pawn C ++类,该函数只是将消息记录到输出日志并在默认构造函数中注册该函数

6,添加从我的C ++ Pawn类派生的蓝图类,并在其组件中添加多维数据集(静态网格组件),然后检查&#34;隐藏在游戏&#34; 在其详细信息面板中 或
如果想使用角色的默认CollisionProfile Pawn来接收Clicked EventVisibility必须设置为Block(项目设置 - &gt;引擎 - &gt;碰撞 - &gt;预设 - &gt; Pawn - &gt; Trace Type - &gt; Visibility)。

enter image description here

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

7,将我的蓝图Pawns放入播放器前面的场景

8,播放关卡,单击我的蓝图Pawn类的立方体,查看输出日志并看到该消息出现

主要代码:

在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"));
}