UE4。当外部是控制器时,Widget 组件不显示
UE4. Widget component doesn't show up when its outer is controller
正如所说,在 UE 4.27 中,当其外部是播放器控制器时,小部件组件不会显示。但在 4.18 版本中它起作用了。
你能解释一下为什么吗?
我如何(如果可能的话)让它在 4.27 中工作?
在widget组件中设置了widget。
重现:
.h:
UPROPERTY(EditDefaultsOnly)
TSubclassOf<UComicFXWidgetComponent> ComicWidgetClass;
UComicFXWidgetComponent* NewComponent;
我的 .cpp 代码有效:
“开始播放”:
// If I change "this" with PlayerController ref then it will not work
NewComponent = NewObject<UComicFXWidgetComponent>(this, ComicWidgetClass);
NewComponent->RegisterComponent();
“InteractButtonPressed”:
NewComponent->AttachToComponent(equippedWeapon_->mesh_, FAttachmentTransformRules::SnapToTargetNotIncludingScale, TEXT("DamageSocket"));
我的 .cpp 代码 不起作用:
“开始播放”:
APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
NewComponent = NewObject<UComicFXWidgetComponent>(PC, ComicWidgetClass); // "this" replaced with "PC"
NewComponent->RegisterComponent();
“InteractButtonPressed”:
NewComponent->AttachToComponent(equippedWeapon_->mesh_, FAttachmentTransformRules::SnapToTargetNotIncludingScale, TEXT("DamageSocket"));
将 UMG 添加到 * .build.cs
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "UMG" });
为您的角色添加代码
.h
UPROPERTY(VisibleDefaultsOnly)
UWidgetComponent* WidgetComponent;
.cpp
Construct
{
MyComponent = CreateDefaultSubobject <UWidgetComponent>(TEXT("DamageWidget"));
//EquippedWeapon Должен быть USkeletalMeshComponent, не mesh
MyComponent->AttachToComponent(EquippedWeapon, FAttachmentTransformRules::KeepRelativeTransform, TEXT("DamageSocket"));
MyComponent->SetWidgetSpace(EWidgetSpace::Screen);
MyComponent->SetDrawSize(FVector2D(100.f, 50.f));//Your size
}
- 结束
好的。答案是:
APlayerController 派生自AController。并且它的构造函数中的 AController 调用 SetHidden(true);
并且它影响它的 children (或外部是控制器的演员)。
要解决只需在您的 Controller 构造函数中添加:
SetActorHiddenInGame(false);
正如所说,在 UE 4.27 中,当其外部是播放器控制器时,小部件组件不会显示。但在 4.18 版本中它起作用了。
你能解释一下为什么吗?
我如何(如果可能的话)让它在 4.27 中工作?
在widget组件中设置了widget。
重现:
.h:
UPROPERTY(EditDefaultsOnly)
TSubclassOf<UComicFXWidgetComponent> ComicWidgetClass;
UComicFXWidgetComponent* NewComponent;
我的 .cpp 代码有效:
“开始播放”:
// If I change "this" with PlayerController ref then it will not work
NewComponent = NewObject<UComicFXWidgetComponent>(this, ComicWidgetClass);
NewComponent->RegisterComponent();
“InteractButtonPressed”:
NewComponent->AttachToComponent(equippedWeapon_->mesh_, FAttachmentTransformRules::SnapToTargetNotIncludingScale, TEXT("DamageSocket"));
我的 .cpp 代码 不起作用:
“开始播放”:
APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
NewComponent = NewObject<UComicFXWidgetComponent>(PC, ComicWidgetClass); // "this" replaced with "PC"
NewComponent->RegisterComponent();
“InteractButtonPressed”:
NewComponent->AttachToComponent(equippedWeapon_->mesh_, FAttachmentTransformRules::SnapToTargetNotIncludingScale, TEXT("DamageSocket"));
将 UMG 添加到 * .build.cs
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "UMG" });
为您的角色添加代码
.h
UPROPERTY(VisibleDefaultsOnly)
UWidgetComponent* WidgetComponent;
.cpp
Construct
{
MyComponent = CreateDefaultSubobject <UWidgetComponent>(TEXT("DamageWidget"));
//EquippedWeapon Должен быть USkeletalMeshComponent, не mesh
MyComponent->AttachToComponent(EquippedWeapon, FAttachmentTransformRules::KeepRelativeTransform, TEXT("DamageSocket"));
MyComponent->SetWidgetSpace(EWidgetSpace::Screen);
MyComponent->SetDrawSize(FVector2D(100.f, 50.f));//Your size
}
- 结束
好的。答案是:
APlayerController 派生自AController。并且它的构造函数中的 AController 调用 SetHidden(true);
并且它影响它的 children (或外部是控制器的演员)。
要解决只需在您的 Controller 构造函数中添加:
SetActorHiddenInGame(false);