前言:
笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个OpenCV学习笔记专栏已完结,在学习完OpenCV后,我继续学习C++,并用纯C++做UE4项目的方式继续提升自己的水平。
梁迪老师的水平非常高,他的课程本来也无需笔记:课程本身即为最好的笔记。但由于我天赋有限,还是边看边记,以防遗忘——知识点太多,步骤太繁杂了。在学习过程中,我也偶有思考,思索为什么某个方法老师要这样做。所以,一是为了记录,二是为了分享,才有了这个专栏。
内容方面,由于我在开启这个专栏时,此项目已经做完很多了。所以,前期的一些大篇幅叙述的知识,可能在后期应用中一带而过。以及,前期的一些知识,后期会重新剖析,并加上我的个人理解。
另外,若有学术交流/学业交流意愿,可以邮件联系1246210283@qq.com,希望一齐进步。
本篇学习内容:
10.自定义Button控件
11.如何输出Debug信息
12.实现游戏设置控件
10.自定义Button控件
(1)UE4有SButton,我们没有用UE4自带的SButton,而是自己写了一个自己的Button控件,即自定义SButton控件
(2) 这个控件从属于MenuWidget的Childslot,在SAssignNew(ContentBox,SVerticalBox)下添加了SSlAiMenuItemWidget
ContentBox->AddSlot()
[
SNew(SSlAiMenuItemWidget) //这样写等同于在SAssignNew (ContentBox,SVerticalBox)下面 +SVerticalBox::Slot()[SNew(SSlAiMenuItemWidget)]
.ItemText(NSLOCTEXT("SlAiMenu","StartGame","StartGame"))
.ItemType(EMenuItem::StartGame)//这两个属性在MenuItemWidget.h中添加属性后,就可以在这里设置了
.Onclicked(this,&SSlAiMenuWidget::MenuItemOnclicked)
];
(3) 我们在MenuItemWidget文件中设置了属性,所以就可以在添加的SSlAiMenuItemWidget设置其属性。
(4) 随后,我们自定义了一个委托(该委托在SButton中是自带的),绑定了我们自定义的Onclicked函数。
UE4提供了很多声明委托的模板,包括1参数-5参数等等
声明委托之后,在下面添加SLATE_EVENT(FItemClicked,Onclicked),随后在MenuWidget中声明一个函数
void MenuItemOnclicked(EMenuItem::Type ItemType);
这个函数的参数对应const EMenuItem::Type
然后去MenuWidget的childslot下的MenuItemWidget下就可以绑定Onclicked到 SSlAiMenuWidget::MenuItemOnclicked
(5)为了顺利触发Onclicked,我们重写了部分鼠标事件。在SButton中,重写了更多的鼠标事件。在我们自定义的这个控件中,只重写了3个。
(6) 除此之外,在按钮按下时,按钮颜色会改变,这一部分通过SImage绑定ColorAndOpacity(this,&SSlAiMenuItemWidget::GetTintColor)来实现。
(7) 随后实现GetTintColor函数。
11.如何输出Debug信息
准备一个空类,在里面声明命名空间并实现Debug函数即可
#include "Engine/World.h"
#include "Engine/GameEngine.h"
namespace SlAiHelper
{
FORCEINLINE void Debug(FString Message, float Duration = 3.f) {
if (GEngine) {
GEngine->AddOnScreenDebugMessage(-1, Duration, FColor::Yellow, Message); //打印一段黄色的文字,持续Duration时间
}
}
}
12.实现游戏设置控件
(1)按照惯例先获取Menu样式
(2)游戏设置界面有三行内容,所以采用SVerticalBox
(3)ChildSlot层级:先用SBox定好窗口大小,然后添加背景图片,然后添加SOverlay,在SOverlay下面 添加SVerticalBox,然后添加3个+SVerticalBox::Slot()
(4)第一行是中英文选项,以2个CheckBox实现,在CheckBox后面跟着文字,这个文字用STextBlock实 现。
由于SCheckBox动态变化,所以需要创建指针。
随后将CheckBox绑定函数,用自带的OnCheckStateChanged委托。
我们最好是统一设置样式。在设置样式时,要添加6个样式。这对应蓝图中CheckBox的Style里 的6个选项。(在SlAiMenuWidgetStyle中添加笔刷)
(5)第二行是音量调节,以一个Text、一个SizeBox、一个Text显示百分比构成。
(6)第三行是音效调节,和第二行结构相同。
注意,音量和音效要根据上一次关闭游戏时设置的值来进行初始化。所以这两个值保存在DataHandle中。
(7)此外,为了以后能在别的控件中调用修改音量、音效、语言的函数,我们定义了两个委托(在 GameOptionWidget中)并在.cpp文件中获取委托。
然后在.cpp的Childslot中绑定的函数的实现里,把原本的代码改为调用委托。
再在MenuWidget中定义修改语言、音效、音量的函数,函数的实现代码就是被改为调用委托 的函数的原本代码。
再在MenuWidget的.cpp文件中的Childslot创建类时就绑定这两个委托。