前言
Slate语法分析
UE5 Slate(1):Slate语法分析 - 知乎
基本类型
- 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_ARGUMENT(bool, IsFocusable) SLATE_END_ARGS() void Construct(const FArguments& InArgs); private: uint8 bIsFocusable:1; }; void STestWidget::Construct(const FArguments& InArgs) { bIsFocusable = InArgs._IsFocusable; }
SNew(SButton) .IsFocusable(true)
|
宏
- 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() \ };
|
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(); \ }
|
前半部分: 返回了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):编辑器扩展 - 知乎