[UE4入门笔记(4)] 10.自定义Button控件 11.如何输出Debug信息 12.实现游戏设置控件 --梁迪老师UE4纯C++&Slate开发沙盒游戏

前言:

笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个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创建类时就绑定这两个委托。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值