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

文章讲述了作者在学习C++和使用UE4引擎进行项目开发的过程中,如何自定义Button控件,包括从属关系设置、属性定义、鼠标事件重写和颜色变化。此外,还介绍了如何输出Debug信息以及实现游戏设置控件,包括音量和语言选项的设定与调整功能。

前言:

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

<think>好的,用户想了解如何实现Unreal Engine的背包系统。首先,我需要整理现有的引用资料,看看有哪些可用的信息。引用1提到用C++创建背包系统,引用了UE4的教程。引用2详细说明了背包UI的结构,使用SOverlay、SBox等Slate组件。引用3提到了Tick事件,可能用于实时更新背包状态。引用4是关于导入资产和设置UI纹理的。 用户可能需要从基础开始,了解如何搭建背包系统的框架。需要分步骤讲解,包括UI设计、数据结构、交互逻辑和优化。可能需要结合C++和蓝图两种方法,但用户的问题中引用的资料既有C++也有蓝图的内容,所以应该都涵盖一下。 首先,背包系统的核心是物品管理,可能需要用结构体或类来表示物品属性。引用1中的C++代码可以作为参考,创建InventoryComponent。然后,UI部分需要用到Slate或UMG,引用2详细描述了UI结构,应该引用这部分内容来说明如何布局背包界面。 接着,交互逻辑包括物品的添加、拖拽、合成等,可能需要事件分发和处理,引用3的Tick事件可能用于实时检测物品位置变化。但Tick事件要谨慎使用,避免性能问题,所以需要提到优化方法,比如只在需要时启用Tick。 另外,引用4提到的资产导入和纹理设置对UI美观很重要,应该提醒用户正确设置纹理压缩和LOD,以优化内存和显示效果。 用户可能遇到的问题包括UI布局错乱、物品数据同步、性能优化等,需要针对这些常见问题给出解决方案,比如使用SOverlay自适应布局,数据同步使用委托或事件分发,性能方面建议分帧加载或虚拟列表。 最后,生成相关问题,帮助用户深入理解,比如如何实现拖拽功能、数据保存、网络同步等,这些可能都是用户后续会遇到的。</think>### UE4/UE5背包系统实现指南 #### 一、基础框架搭建(C++实现) 1. **物品数据结构** 建议使用`FItemInfo`结构体存储物品属性: ```cpp USTRUCT(BlueprintType) struct FItemInfo { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite) FName ItemID; UPROPERTY(EditAnywhere, BlueprintReadWrite) FText ItemName; UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 MaxStack; }; ``` 引用[1]中的背包系统通过`UInventoryComponent`管理物品数据,建议继承`UActorComponent`实现类似功能[^1]。 2. **UI架构设计** 推荐使用多层嵌套的Slate控件实现复杂布局: ``` SOverlay (根组件) └── SBox (自适应容器) └── SOverlay ├── SImage (背景) ├── SCanvas (背包网格) ├── SVerticalBox (快捷栏) └── SButton (合成按钮) ``` 这种结构符合引用[2]中梁迪老师的背包系统设计规范[^2]。 #### 二、核心功能实现 1. **物品拖拽交互** ```cpp void SInventorySlot::OnDragDetected(...) { TSharedPtr<SDragItem> DragWidget = SNew(SDragItem).ItemInfo(this->ItemInfo); return FReply::Handled().BeginDragDrop(DragWidget.ToSharedRef()); } ``` 建议结合`OnDrop`事件实现拖放逻辑,使用`FSlateApplication::Get().GetCursorPos()`获取实时位置。 2. **数据同步机制** 推荐使用`DECLARE_DYNAMIC_MULTICAST_DELEGATE`创建物品变更事件: ```cpp UPROPERTY(BlueprintAssignable) FOnInventoryUpdated OnInventoryUpdated; ``` 通过事件驱动UI更新,避免每帧查询的性能损耗[^3]。 #### 三、性能优化方案 1. **纹理处理** 按引用[4]建议设置纹理参数: - Compression Settings → UserInterface2D - Texture Group → UI - Mip Gen Settings → NoMipmaps[^4] 2. **动态加载策略** ```cpp void UInventoryWidget::NativeTick(...) { if(ShouldUpdate) { UpdateGrid(); ShouldUpdate = false; } } ``` 建议将高频操作与Tick事件解耦,参考引用[3]中的Tick优化方法。 #### 四、常见问题解决方案 | 问题现象 | 排查方向 | 修复建议 | |---------|---------|---------| | UI布局错乱 | 控件层级关系 | 检查SOverlay的Slot顺序 | | 物品显示错位 | 锚点设置 | 确认CanvasPanel的坐标计算 | | 数据不同步 | 网络复制配置 | 检查属性Replication设置 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值