完成本迷你教程之前,请前往完成以下迷你教程:
·实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色;
在上一次的迷你教程的LearnWidgets工程上进行(如果你不亲自动手做的话,只关注标代码部分即可粗略知道要点)。
本节将会批量介绍一些重要的UMG中的蓝图节点对应的C++代码;
第一个实验:
在蓝图中:
在代码中则等价为:
▼代码开始
void AWidgetMng::LearnImage() { UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage"))); if (MyImage) { UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("Learning How 2 Use C++ to Change UI")); if (MyImage->GetVisibility() != ESlateVisibility::Hidden) MyImage->SetVisibility(ESlateVisibility::Hidden); else MyImage->SetVisibility(ESlateVisibility::Visible); } }
▲代码结束
第二组实验:
在蓝图中:
在代码中则等价为:
▼代码开始 void AWidgetMng::LearnImage() { UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage"))); if (MyImage) { UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("Learning How 2 Use C++ to Change UI")); MyImage->RemoveFromParent(); } } ▲代码结束
第三组实验:
在蓝图中:
在代码中则等价于:
void AWidgetMng::LearnImage()
{
UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage")));
if (MyImage)
{
if (MyImage->IsHovered())
{
UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("Hovering"));
}
}
}
如果你想看到效果,在关卡蓝图中设置
效果:
第四组实验:
第4.1步:新建一个材质如下(名为MyM):
第4.2步:应用它;
好了,本教程假设你知道动态材质实例和设置参数,如果不知道,请去了解。
为了实现蓝图中的下述功能:
在C++中可以这样做:
void AWidgetMng::LearnImage() { UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage"))); if (MyImage) { UMaterialInstanceDynamic* MID = MyImage->GetDynamicMaterial(); MID->SetScalarParameterValue(FName(TEXT("Red")), 1.0f ); } } Tips:注意头文件:#include "Materials/MaterialInstanceDynamic.h"
如果想要读取参数值,可以这样做:
▼代码开始
void AWidgetMng::LearnImage()
{
UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage")));
if (MyImage)
{
UMaterialInstanceDynamic* MID = MyImage->GetDynamicMaterial();
float RedValueCurrent = 0.f;
MID->GetScalarParameterValue(FName(TEXT("Red")), RedValueCurrent);
MID->SetScalarParameterValue(FName(TEXT("Red")),
RedValueCurrent + 0.1
);
}
}
▲代码结束
(上述代码的效果是每一次Action1都会变红一些)
第五组实验:
寻找子组件。首先,在weapondisplayer中添加子userwidget,效果如下(其中“”Card“” TextBlock是subwidgetcard中的唯一小部件);
▼代码开始 void AWidgetMng::LearnImage() { UImage* MyImage = Cast<UImage>(SlaveWidget->GetWidgetFromName(TEXT("MyImage"))); if (MyImage) { UUserWidget* MySubWidget = Cast<UUserWidget>(SlaveWidget->GetWidgetFromName(TEXT("MySubWidget"))); if (MySubWidget) { UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("75 LearnImage")); UTextBlock* MySubWidgetText = Cast<UTextBlock>(MySubWidget->GetWidgetFromName(TEXT("MySubWidgetText"))); if (MySubWidgetText) { MySubWidgetText->SetText(FText::FromString("success")); } } } } ▲代码结束
——小江村儿的文杰 zouwj5@qq.com 2017年8月2日16:58:48