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:游戏模式:鼠标点击模式
答案 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 Event
,Visibility
必须设置为Block
(项目设置 - &gt;引擎 - &gt;碰撞 - &gt;预设 - &gt; Pawn - &gt; Trace Type - &gt; Visibility)。
严格的方法是为点击测试添加新的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"));
}