大神的Blog挂了,从Bing快照里复制过来的备份

时间:2021-10-22 07:08:30

UWidget封装SWidgetUMG

2015年8月30日0

为了使用UMG中的一些高级或便利特性,需要将制作好的Slate控件封装UWidget中去。

当前UE4版本4.8.3。

将Slate封装UMG中去有很多的好处,因为在代码中对需要重用的控件进行不断的重新布局是一件非常繁琐的事情。同时,UMG也有在3D空间中进行显示这样的高级功能。

由于UMG本身就是对Slate的封装,所以这个过程可以参照UE4的源代码进行研究。

这里所做的是尝试对上一回所做的文件目录树进行封装

直接上代码

CListViewWidget.h

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
#include "CListViewWidget.generated.h"
UCLASS()
class TEST_MP_API UCListViewWidget : public UWidget
{
    GENERATED_UCLASS_BODY()
public:
#if WITH_EDITOR
    // UWidget interface
    virtual const FSlateBrush* GetEditorIcon() override;
    virtual const FText GetPaletteCategory() override;
    virtual void OnCreationFromPalette() override;
    // End UWidget interface
#endif
protected:
    // UWidget interface
    virtual TSharedRef<SWidget> RebuildWidget() override;
    virtual void OnBindingChanged(const FName& Property) override;
    // End of UWidget interface
protected:
    TSharedPtr<class SDDFileTree> MyFileTree;
};

封装类直接继承自UWidget即可,剩下的就是对UWidget中的函数进行实现。

CListViewWidget.cpp

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Fill out your copyright notice in the Description page of Project Settings.
#include "Test_mp.h"
#include "SDDFileTree.h"
#include "CListViewWidget.h"
/** GENERATED_UCLASS_BODY() */
UCListViewWidget::UCListViewWidget(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    bIsVariable = false;
}
/** <编辑器属性 */
#if WITH_EDITOR
// <图标
const FSlateBrush* UCListViewWidget::GetEditorIcon()
{
    return FUMGStyle::Get().GetBrush("Widget.TextBlock");
}
// <分类目录
const FText UCListViewWidget::GetPaletteCategory()
{
    return NSLOCTEXT("Testmp", "Custom", "Ch_Custom");
}
// <创建时的默认值
void UCListViewWidget::OnCreationFromPalette()
{
    ;
}
#endif
TSharedRef<SWidget> UCListViewWidget::RebuildWidget()
{
    MyFileTree = SNew(SDDFileTree).OwnerHUD(nullptr);
    return MyFileTree.ToSharedRef();
}
void UCListViewWidget::OnBindingChanged(const FName& Property)
{
    Super::OnBindingChanged(Property);
    if (MyFileTree.IsValid())
    {
        ;
    }
}

在所有的函数中,RebuildWidget()是最重要的。

参看UWidget的源代码可以发现,所有对被封装SWidget的引用都是通过这个函数获得的,因此在这里面写上SWidget对应的构造生成就可以了。

OnBindingChanged函数是用于属性代理通知的,这里是简单的封装,没有提供属性代理,因此直接return也是可以的。

在WITH_EDITOR宏中的是编辑器属性,用于封装后的UWidget在蓝图编辑器中显示。具体每一个函数的含义已经在注释中了。

将上面的代码编译通过之后,就可以在UMG的编辑器中看到我们添加的控件了:

大神的Blog挂了,从Bing快照里复制过来的备份

将CListViewWidget拖动控件蓝图上,并在HUD中展示此控件蓝图,就能在项目中与其他UMG控件一样使用了:

大神的Blog挂了,从Bing快照里复制过来的备份

这样以来Slate的使用就会变得方便很多。