作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget。

  1.GameHUDWidget:负责游戏中界面UI的整体显示

  2.ShortcutWidget:负责快捷栏部件的显示与逻辑

然后我们通过以下步骤依次创建显示快捷栏UI:

  01.创建ShortcutWidget快捷栏组件:存储容器逻辑、界面布局、样式、初始化

ShortcutWidget.h:

 1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "Data/SDTypes.h"
7
8 #include "Widgets/SCompoundWidget.h"
9
10 struct FSDGameStyle;
11 class STextBlock;
12 class SUniformGridPanel;
13
14 /**
15 *
16 */
17 class SANDBOXGAME_API SSDShortcutWidget : public SCompoundWidget
18 {
19 public:
20 SLATE_BEGIN_ARGS(SSDShortcutWidget)
21 {}
22 SLATE_END_ARGS()
23
24 /** Constructs this widget with InArgs */
25 void Construct(const FArguments& InArgs);
26
27 virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
28
29 public:
30 // 创建委托变量
31 FRegisterShortcutContainer RegisterShortcutContainer;
32
33 private:
34 // 初始化所有容器
35 void InitContainer();
36
37 private:
38 // 获取GameWidgetStyle
39 const FSDGameStyle* GameStyle;
40
41 // 物品名字指针
42 TSharedPtr<STextBlock> shortcutInfoTextBlock;
43
44 // 网格指针
45 TSharedPtr<SUniformGridPanel> GridPanel;
46
47 // 是否初始化容器
48 bool IsInitContainer;
49
50 };

ShortcutWidget.cpp:构造函数(获取样式蓝图实例、UI布局、初始化变量)、Tick指针中检查初始化、InitializeContainer(更新快捷栏函数,实现单个快捷框UI绘制、变量new赋值)

 1 #include "UI/Widget/SSlAiShortcutWidget.h"
2 #include "SlateOptMacros.h"
3 #include "SlAiStyle.h"
4 #include "SlAiGameWidgetStyle.h"
5 #include "SBox.h"
6 #include "SOverlay.h"
7 #include "STextBlock.h"
8 #include "SUniformGridPanel.h"
9 #include "SBorder.h"
10
11 BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
12 void SSlAiShortcutWidget::Construct(const FArguments& InArgs)
13 {
14 // 获取 GameStyle
15 GameStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiGameStyle>("BPSDGameStyle");
16
17 ChildSlot
18 [
19 SNew(SBox)
20 .WidthOverride(900.f)
21 .HeightOverride(160.f)
22 [
23 SNew(SOverlay)
24
25 +SOverlay::Slot()
26 .HAlign(HAlign_Center)
27 .VAlign(VAlign_Top)
28 [
29 SAssignNew(ShortcutInfoTextBlock, STextBlock)
30 .Font(GameStyle->Font_Outline_40)
31 .ColorAndOpacity(GameStyle->FontColor_White)
32 ]
33
34 +SOverlay::Slot()
35 .HAlign(HAlign_Fill)
36 .VAlign(VAlign_Fill)
37 .Padding(FMargin(0.f, 60.f, 0.f, 0.f))
38 [
39 SAssignNew(GridPanel, SUniformGridPanel)
40 ]
41 ]
42 ];
43
44 // 设置没有初始化容器
45 IsInitializeContainer = false;
46 }
47 END_SLATE_FUNCTION_BUILD_OPTIMIZATION
48
49 void SSlAiShortcutWidget::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
50 {
51 if (!IsInitializeContainer) {
52 InitializeContainer();
53 IsInitializeContainer = true;
54 }
55 }
56
57 void SSlAiShortcutWidget::InitializeContainer()
58 {
59 for (int i = 0; i < 9; ++i) {
60 // 创建容器
61 TSharedPtr<SBorder> ContainerBorder;
62 TSharedPtr<SBorder> ObjectImage;
63 TSharedPtr<STextBlock> ObjectNumText;
64
65 SAssignNew(ContainerBorder, SBorder)
66 .Padding(FMargin(10.f))
67 // 供测试用,待删除
68 .BorderImage(&GameStyle->NormalContainerBrush)
69
70 [
71 SAssignNew(ObjectImage, SBorder)
72 .HAlign(HAlign_Right)
73 .VAlign(VAlign_Bottom)
74 .Padding(FMargin(0.f, 0.f, 5.f, 0.f))
75 // 供测试用,待删除
76 .BorderImage(&GameStyle->EmptyBrush)
77
78 [
79 SAssignNew(ObjectNumText, STextBlock)
80 .Font(GameStyle->Font_Outline_20)
81 .ColorAndOpacity(GameStyle->FontColor_Black)
82 // 供测试用,待删除
83 .Text(FText::FromString("12"))
84
85 ]
86 ];
87
88 GridPanel->AddSlot(i, 0)
89 [
90 ContainerBorder->AsShared()
91 ];
92 }
93 }

  02.添加快捷栏UI组件的样式:在GameStyle.h文件中添加样式接口、在蓝图中创建GameStyle的蓝图然后选中样式

SlAiGameStyle.h:添加样式接口

  1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "Styling/SlateWidgetStyle.h"
7 #include "Styling/SlateWidgetStyleContainerBase.h"
8
9 #include "SDGameWidgetStyle.generated.h"
10
11 /**
12 *
13 */
14 USTRUCT()
15 struct SANDBOXGAME_API FSDGameStyle : public FSlateWidgetStyle
16 {
17 GENERATED_USTRUCT_BODY()
18
19 FSDGameStyle();
20 virtual ~FSDGameStyle();
21
22 // FSlateWidgetStyle
23 virtual void GetResources(TArray<const FSlateBrush*>& OutBrushes) const override;
24 static const FName TypeName;
25 virtual const FName GetTypeName() const override { return TypeName; };
26 static const FSDGameStyle& GetDefault();
27
28 // 添加笔刷
29 /*
30 * 快捷栏容器Brush
31 */
32 UPROPERTY(EditAnywhere, Category = "Package")
33 FSlateBrush NormalContainerBrush;
34
35 /*
36 * 快捷栏被选中时Brush
37 */
38 UPROPERTY(EditAnywhere, Category = "Package")
39 FSlateBrush ChoosedContainerBrush;
40
41 /*
42 * 空Brush
43 */
44 UPROPERTY(EditAnywhere, Category = "Package")
45 FSlateBrush EmptyBrush;
46
47 // 物品笔刷
48 UPROPERTY(EditAnywhere, Category = "Package")
49 FSlateBrush ObjectBrush_1;
50 UPROPERTY(EditAnywhere, Category = "Package")
51 FSlateBrush ObjectBrush_2;
52 UPROPERTY(EditAnywhere, Category = "Package")
53 FSlateBrush ObjectBrush_3;
54 UPROPERTY(EditAnywhere, Category = "Package")
55 FSlateBrush ObjectBrush_4;
56 UPROPERTY(EditAnywhere, Category = "Package")
57 FSlateBrush ObjectBrush_5;
58 UPROPERTY(EditAnywhere, Category = "Package")
59 FSlateBrush ObjectBrush_6;
60 UPROPERTY(EditAnywhere, Category = "Package")
61 FSlateBrush ObjectBrush_7;
62
63
64 // 添加样式
65 /*
66 * 白色颜色
67 */
68 UPROPERTY(EditAnywhere, Category = "Common")
69 FLinearColor FontColor_White;
70
71 /*
72 * 黑色颜色
73 */
74 UPROPERTY(EditAnywhere, Category = "Common")
75 FLinearColor FontColor_Black;
76
77 /*
78 * 60号字体
79 */
80 UPROPERTY(EditAnywhere, Category = "Common")
81 FSlateFontInfo Font_60;
82
83 /*
84 * 50号字体有轮廓
85 */
86 UPROPERTY(EditAnywhere, Category = "Common")
87 FSlateFontInfo Font_Outline_50;
88
89 /*
90 * 40号字体
91 */
92 UPROPERTY(EditAnywhere, Category = "Common")
93 FSlateFontInfo Font_40;
94
95 /*
96 * 40号字体有轮廓
97 */
98 UPROPERTY(EditAnywhere, Category = "Common")
99 FSlateFontInfo Font_Outline_40;
100
101 /*
102 * 30号字体
103 */
104 UPROPERTY(EditAnywhere, Category = "Common")
105 FSlateFontInfo Font_30;
106
107 /*
108 * 20号字体
109 */
110 UPROPERTY(EditAnywhere, Category = "Common")
111 FSlateFontInfo Font_20;
112
113 /*
114 * 20号字体有轮廓
115 */
116 UPROPERTY(EditAnywhere, Category = "Common")
117 FSlateFontInfo Font_Outline_20;
118
119 /*
120 * 16号字体有轮廓
121 */
122 UPROPERTY(EditAnywhere, Category = "Common")
123 FSlateFontInfo Font_Outline_16;
124
125 /*
126 * 16号字体
127 */
128 UPROPERTY(EditAnywhere, Category = "Common")
129 FSlateFontInfo Font_16;
130
131
132 };
133
134 /**
135 */
136 UCLASS(hidecategories=Object, MinimalAPI)
137 class USDGameWidgetStyle : public USlateWidgetStyleContainerBase
138 {
139 GENERATED_BODY()
140
141 public:
142 /** The actual data describing the widget appearance. */
143 UPROPERTY(Category=Appearance, EditAnywhere, meta=(ShowOnlyInnerProperties))
144 FSDGameStyle WidgetStyle;
145
146 virtual const struct FSlateWidgetStyle* const GetStyle() const override
147 {
148 return static_cast< const struct FSlateWidgetStyle* >( &WidgetStyle );
149 }
150 };

ue蓝图:创建样式蓝图

配置样式

  03.在GameHUDWidget中添加快捷栏控件ShortcutWidget指针,并根据窗口宽度自动调节快捷栏控件大小

GameHUDWidget.h:添加快捷栏控件指针、获取屏幕Size函数、大小变更绑定函数GetUIScaler()

GameHUDWidget.cpp:编辑GameHUD界面(绑定大小自适应函数、组织控件排布)、对应功能函数实现

  04.将GameHUDWidget添加进视口:在GameHUD文件中添加GameHUDWidget控件.

GameHUDWidget.h:添加Widget组件指针

GameHUDWidget.cpp:添加组件到视口

  

最终显示效果

UE4纯C++实现游戏快捷栏之创建快捷栏UI的更多相关文章

  1. 判读是不是对象字面量(纯对象)。对象字面量创建方式有{}、new Object()创建

    //判读是否是自身属性 function isHasPro(obj,pro){ return obj.hasOwnProperty(pro) ? true : false; } //判读是不是对象字面 ...

  2. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

  3. 使用WPF来创建 Metro UI程序

    本文转载:http://www.cnblogs.com/TianFang/p/3184211.html 这个是我以前网上看到的一篇文章,原文地址是:Building a Metro UI with W ...

  4. 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI

    原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容 ...

  5. Qt基础——让使用Designer创建的UI也能自动适应窗口大小

    原文请看:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html 我们知道,通过Qt的各种Layout可以实现控件的自动布局. 但 ...

  6. 用swift创建各种UI控件【iSwifting社区】

    为了方便大家学习,www.iSwifting.com社区为大家准备了创建各种UI控件的代码.開始看着语法可能有些别扭,当用习惯了,就认为还是非常不错的. 社区还添加了问答专区.有问题的朋友.虽然问.大 ...

  7. 使用UE4公布安卓平台游戏

    使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...

  8. IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)

    这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...

  9. UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合

    前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发.   UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fr ...

  10. UE4 Windows平台部署游戏到IOS 第一部分

    UE4 Version 4.11.2 or 4.12.2 方法步骤: 1.申请IOS开发者账号,大概三个工作日左右激活. 2.下载iTunes 3.创建项目因为是在Windows平台,根据官方的提示只 ...

随机推荐

  1. LaTeX 编译警告:Script 'CJK' not explicitly supported within font 'FandolSong-Regular'. Check the typeset output, and if it is okay then ignore this warning. Otherwise a different font should be chosen.

    在编译一篇中文文档时遇到如下警告: Package fontspec Warning: Script 'CJK' not explicitly supported within font 'Fando ...

  2. VC 单文档FormView视图增加打印预览

    1修改my.rc文件二处 3 TEXTINCLUDE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO ...

  3. .NET 压缩/解压文件

    本文为大家介绍下.NET解压/压缩zip文件.虽然解压缩不是啥核心技术,但压缩性能以及进度处理还是需要关注下,针对使用较多的zip开源组件验证,给大家提供技术选型 目前了解到的常用技术方案有Syste ...

  4. 超轻量级、支持插件的 .NET 网络通信框架

    前言 给大家推荐一个轻量级的.支持插件的综合网络通信库:TouchSocket. TouchSocket 的基础通信功能包括 TCP.UDP.SSL.RPC 和 HTTP.其中,HTTP 服务器支持 ...

  5. 前端解决Long类型精度丢失的问题

    问题 数据库数据: 前端得到的数据: 出现了Long类型的数据出现精度丢失问题! 原因 JS中Long最大值:9007199254740992 JAVA中Long最大值:922337203685477 ...

  6. 小tips:vue2中broadcast和dispatch的实现

    /* * broadcast 事件广播 * @param {componentName} 组件名称 * @param {eventName} 事件名 * @param {params} 参数 * 遍历 ...

  7. 小tips:npm与npx的区别

    npm npm是Node.js的软件包管理器,其目标是自动化的依赖性和软件包管理. 这意味着,可以在package.json文件中为项目指定所有依赖项(软件包),当需要为其安装依赖项时,只要运行npm ...

  8. Angular 18+ 高级教程 – Component 组件 の Structural Directive (结构型指令) & Syntax Reference (微语法)

    前言 在 Attribute Directives 属性型指令 文章中,我们学习过了指令.指令是没有 HTML 和 CSS 的组件,它单纯用于封装 JS 的部分. 这一篇我们将继续学习另一种指令 -- ...

  9. JavaScript – Sort

    前言 排序是很常见的需求. 虽然看似简单, 但其实暗藏杀机. 一不小心就会搞出 Bug 哦. 这篇就来聊聊 JS 的排序. 参考 原生JS数组sort()排序方法内部原理探究 值的比较 js中的loc ...

  10. 高通BoostFramework概要介绍

    概要介绍 为了保证Android系统的顺滑体验,各个厂家都有针对性的对Android系统做了性能优化的方案.高通也基于AOSP开发了一套性能优化框架,本文叫做BoostFramework.本文将介绍下 ...