实例甜点 Unreal Engine 4迷你教程(3)之用C++改变Image小部件的其它属性

完成本迷你教程之前,请前往完成以下迷你教程:

·实例甜点 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 20178216:58:48

原文地址:https://www.cnblogs.com/JackSamuel/p/7283513.html