前言

Slate语法分析

UE5 Slate(1):Slate语法分析 - 知乎

基本类型

img
  • SLeafWidget:该控件没有子节点。
  • SCompoundWidget:该控件包含一个子节点(成员变量ChildSlot)
  • SPanel:该控件包含一个子节点数组(成员变量Children)。

基本用法

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
class SLATE_API SButton : public SBorder
{
public:
SLATE_BEGIN_ARGS(SButton)
:_IsFocusable(false)//变量的默认值
{
}
//定义一个Slate变量,实际的变量命要在前面加一个下划线
SLATE_ARGUMENT(bool, IsFocusable)
//结束定义
SLATE_END_ARGS()

void Construct(const FArguments& InArgs);
private:
//真正的成员变量
uint8 bIsFocusable:1;

};

void STestWidget::Construct(const FArguments& InArgs)
{
//对成员变量进行赋值
bIsFocusable = InArgs._IsFocusable;
}

//创建这个控件并对变量进行赋值,赋完值后会执行Construct函数
SNew(SButton)
.IsFocusable(true)//对IsFocusable进行设置,实际这里设置的是_IsFocusable

  • SLATE_BEGIN_ARGS和SLATE_END_ARGS

在宏定义了一个内部类,FArguments

1
2
3
4
5
6
7
8
9
#define SLATE_BEGIN_ARGS( WidgetType ) \
public: \
struct FArguments : public TSlateBaseNamedArgs<WidgetType> \
{ \
typedef FArguments WidgetArgsType; \
FORCENOINLINE FArguments()

#define SLATE_END_ARGS() \
};
  • SLATE_ARGUMENT
1
2
3
4
5
6
7
8
9
10
11
12
13
#define SLATE_ARGUMENT( ArgType, ArgName ) \
SLATE_PRIVATE_ARGUMENT_VARIABLE( ArgType, ArgName ); \
SLATE_PRIVATE_ARGUMENT_FUNCTION ( ArgType, ArgName )

#define SLATE_PRIVATE_ARGUMENT_VARIABLE( ArgType, ArgName ) \
ArgType _##ArgName

#define SLATE_PRIVATE_ARGUMENT_FUNCTION( ArgType, ArgName ) \
WidgetArgsType& ArgName( ArgType InArg ) \
{ \
_##ArgName = InArg; \
return static_cast<WidgetArgsType*>(this)->Me(); \
}
  • SNew

前半部分: 返回了TSlateDecl类,这个类对**<<=**这个符号进行了重载(重载operator如下),会调用Slate控件的Construct函数。

后半部分: 创建了一个FArguments(前文SLATE_BEGIN_ARGS声明过)

所以SLATE_ARGUMENT创建的FArguments是一个临时参数,用作传入Construct的变量,你需要定义一个真正使用的变量把他存储起来.

1
2
3
4
5
6
7
8
9
10
11
#define SNew( WidgetType, ... ) \
MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) <<= TYPENAME_OUTSIDE_TEMPLATE WidgetType::FArguments()

struct TSlateDecl{
TSharedRef<WidgetType> operator<<=( const typename WidgetType::FArguments& InArgs ) const
{
_RequiredArgs.CallConstruct(_Widget, InArgs);
...
return _Widget;
}
}

Slate布局与绘制

UE5 Slate(2):Slate布局与绘制 - 知乎

UE5 Slate(3):RetainerBox与InvalidationBox - 知乎

UE5 Slate(4):UMG与Slate - 知乎

UE5 Slate(5):按钮点击的流程 - 知乎

UE5 Slate(6):编辑器Layout - 知乎

UE5 Slate(7):输入相关 - 知乎

UE5 Slate(8):编辑器扩展 - 知乎