Slate概述(笔记二)

Slate概述

优点:

  • 描述清晰(链式编程)
  • 容易构建程序化界面
  • 执行效率比UMG高

缺点:

  • 不好调试
  • 添加动画和设计挺难的
  • 编写效率低

分析
-Slate都继承于SWidget。

class SLATECORE_API SWidget
	: public FSlateControlledConstruction,   //控制Slate生命周期,通过FMemory封装了生成和释放
	  public TSharedFromThis<SWidget>		// Enables 'this->AsShared()'
{
	friend struct FCurveSequence;//与Slate动画相关

public:
	
	/**
	 * 初始化参数
	 */
	void Construct(
		const TAttribute<FText>& InToolTipText,
		const TSharedPtr<IToolTip>& InToolTip,
		const TAttribute< TOptional<EMouseCursor::Type> >& InCursor,
		const TAttribute<bool>& InEnabledState,
		const TAttribute<EVisibility>& InVisibility,
		const float InRenderOpacity,
		const TAttribute<TOptional<FSlateRenderTransform>>& InTransform,
		const TAttribute<FVector2D>& InTransformPivot,
		const FName& InTag,
		const bool InForceVolatile,
		const EWidgetClipping InClipping,
		const EFlowDirectionPreference InFlowPreference,
		const TOptional<FAccessibleWidgetData>& InAccessibleData,
		const TArray<TSharedRef<ISlateMetaData>>& InMetaData);

	void SWidgetConstruct(const TAttribute<FText>& InToolTipText,
		const TSharedPtr<IToolTip>& InToolTip,
		const TAttribute< TOptional<EMouseCursor::Type> >& InCursor,
		const TAttribute<bool>& InEnabledState,
		const TAttribute<EVisibility>& InVisibility,
		const float InRenderOpacity,
		const TAttribute<TOptional<FSlateRenderTransform>>& InTransform,
		const TAttribute<FVector2D>& InTransformPivot,
		const FName& InTag,
		const bool InForceVolatile,
		const EWidgetClipping InClipping,
		const EFlowDirectionPreference InFlowPreference,
		const TOptional<FAccessibleWidgetData>& InAccessibleData,
		const TArray<TSharedRef<ISlateMetaData>>& InMetaData);
		......
  • 在slate中,控件分为三种类型:SLeafWidget不带子槽的控件如TextBlock;SPanel子槽数量为动态的控件如SHorizontalBox,SVerticalBox;SCompoundWidget子槽数量固定的控件如SDockTab,Border,Button等。以上都继承于SWidget。

小提示:

  1. Overlay:有点类似于PhotoShop的图层,是一层一层堆叠的,在代码中或者UE4中放置的位置越往下,图层越偏上;所有图层都可以显示。
  2. Widget Switcher:也是一层一层堆叠结构,但是每次只显示一个图层。
  3. Collapsed :塌陷,彻底消失,不显示,也不在视口中占位置。
  4. Hidden:占位消失,看不见,但仍在视口中占位置。
  5. Slot:插槽。
  6. return FReply::Handled(); :截断消息。表示该消息在这一层已经被截断,不会继续向下分发,通常在该层就进行了处理。
  7. SLATE_EVENT:传递代理 (代理名称、参数类型)
    SLATE_ARGUMENT:传递参数
    SLATE_ATTRIBUTE:定义返回值的代理
    SLATE_STYLE_ARGUMENT:传递样式
    SLATE_SUPPORTS_SLOT:可以运行添加Slot

插件和Slate示例

此示例包含创建插件、Slate自定义控件、样式以及语言本地化等。

  • 创建一个名为ExtenderEditor(名字随意)的ue4项目。
  • 通过ue4创建一个名为MyPlugins(名字自己开心就好)的插件。为了方便,这里直接用了ue4自带的StandaloneWindow,其就是在toolbar自动创建了一个button,点击可出现一个Window。具体如下下图所示。

Slate概述(笔记二)_第1张图片
Slate概述(笔记二)_第2张图片

  • 此处不得不先说一下。因为ue4自带的关系,在创建的插件中,MyPlugins.Build.cs里的Slate和SlateCore两个模块,这里是自动添加上了,若是以其他方式创建的,请一定要看一下MyName(just a 随意的名字).Build.cs文件里的模块添加私有依赖的情况。
    Slate概述(笔记二)_第3张图片
  • 再说一下构建Slate控件的方式有两种分别为SNew和SAssignNew。SNew返回TSharedRef;
    SAssignNew 返回TSharedPtr。实例化方法如下所示(SHelloSlate为控件类):
TSharedRef HelloSlate =SNew(SHelloSlate);
TSharedPtr HelloSlate;
SAssignNew( HelloSlate, SHelloSlate);

由于在ue4中,TSharedRef可以直接转换为TSharedPtr,而TSharedPtr转化为TSharedRef需要用到AsShared() 函数,因此我们一般是先声明一个变量:

TSharedPtr<SHelloSlate> HelloSlate;

然后再实例化:

SNew(SHelloSlate);
SAssignNew(HelloSlate, SHelloSlate);

好了,未完待续。。。

你可能感兴趣的:(Slate概述(笔记二))