Slate VS UMG (Slate控件的基本框架)
入行游戏行业半年多了,UE4的使用也快一年多了。使用较多的还是UMG,蓝图,做着搭UI的活,Gameplay也涉及一些。由于接下来项目,工作除了做Gameplay这一块,还有涉及游戏内的UI,例如游戏内背包,技能等等。想着深入了解一下UI这一块,方便制定一套合理的流程。也是UE4众多模块的第一啃。
关于Slate,第一印象便是:
这是啥???,C++还有这语法吗?
下面就来讲讲我有关于Slate的了解:
所有起源于SWidget,是Slate所有的控件的基类;
这是简单的常用到的Slate控件的继承关系;
SCompoundWidget:只含有一个Slot,意味着他可以添加一个children Widget;
SLeafWidget:没有Slot成员,也就是不含widget;
SPanel:可含有多个Widget,这个类本身没有加Slot结构而是继承于他的子类会去添加自己的Slot结构,并且实现不同的排列方式;
例如其子类SOverlay:
还有SBoxPanel;
关于FSlot的作用就是,在其基类中便可以看出,它重载了操作符[],所以我们可以ChildSlot[SNew(...)]这种写法去添加childrenwidget,而控件的父子关系依托slot实现的;
每一个slot可以存放一个widget,有的控件只有一个slot,所以他有一个孩子,有的控件有多个孩子,就有一个slotArray对应,而他的排列就跟重写SPanel的OnArrangeChildren函数有关了;
以上就是,Slate的控件的基本框架,后续还会深入的探讨关于Slate的render等方面;现在呢,接着说让人一脸懵逼的第一印象;
我们看看控件的初始化函数如下:
看看宏里面的内容:
我们可以看出,例如
SNew( SButton )
.ContentPadding( 1.0f )
.Text( LOCTEXT("ResetLabel", "Reset") )
.OnClicked( this, &SDynamicBrushTest::Reset )
这些写法就是在对属性赋值,并且这些声明的变量都会存在FArguments结构下面,void Construct( const FArguments& InArgs ); 在初始化函数可以使用到SNew时候传进来的参数;
其次就是SLATE_SUPPORTS_SLOT( SOverlay::FOverlaySlot )通过上面的截图知道这里重载了操作符+所以含有Slot的控件可以通过这种方式去添加子widget;
这下明白了这些奇奇怪怪的写法无非是宏封装了,加上操作符重载,实现的一套比较方便的用C++写界面的方式;这些[]+...的符号都是方法的调用还有属性的赋值;虽然这个对于写slate没有多大帮助,但是,至少不会再有畏惧感了;
这是这些天对Slate学习一些简单总结,有很多不完善的地方,后面还有更深入的研究,一点一点慢慢啃,慢慢通过写文章的方式记录学习和工作,有所积累。