UE4纯C++实现游戏快捷栏之创建快捷栏UI
作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏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的更多相关文章
- 判读是不是对象字面量(纯对象)。对象字面量创建方式有{}、new Object()创建
//判读是否是自身属性 function isHasPro(obj,pro){ return obj.hasOwnProperty(pro) ? true : false; } //判读是不是对象字面 ...
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》
概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...
- 使用WPF来创建 Metro UI程序
本文转载:http://www.cnblogs.com/TianFang/p/3184211.html 这个是我以前网上看到的一篇文章,原文地址是:Building a Metro UI with W ...
- 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI
原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容 ...
- Qt基础——让使用Designer创建的UI也能自动适应窗口大小
原文请看:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html 我们知道,通过Qt的各种Layout可以实现控件的自动布局. 但 ...
- 用swift创建各种UI控件【iSwifting社区】
为了方便大家学习,www.iSwifting.com社区为大家准备了创建各种UI控件的代码.開始看着语法可能有些别扭,当用习惯了,就认为还是非常不错的. 社区还添加了问答专区.有问题的朋友.虽然问.大 ...
- 使用UE4公布安卓平台游戏
使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...
- IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)
这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...
- UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合
前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发. UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fr ...
- UE4 Windows平台部署游戏到IOS 第一部分
UE4 Version 4.11.2 or 4.12.2 方法步骤: 1.申请IOS开发者账号,大概三个工作日左右激活. 2.下载iTunes 3.创建项目因为是在Windows平台,根据官方的提示只 ...
随机推荐
- 通过JMX监控weblogic服务
一.JMX简介 JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能,那么怎么理解所谓的"被管理"呢?试想你开发了一个软件(如WEB网站),它是在24小时不间断运行的, ...
- Linux内核信号SIGIO使用实例讲解
一.信号 1. 基本概念 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上, ...
- 平衡搜索树-AVL树 图文详解 (万字长文)
目录 AVL树 AVL树的概念 AVL树节点的定义: AVL树的插入 基本情况分析 平衡因子对应的操作 旋转操作 分析需要旋转的情况 结论 4种旋转操方法与特征 6种双旋平衡因子特征 代码实现 四种旋 ...
- 速通c++
文章目录 1.什么是c++. 2什么是面向对象,什么又是面向过程. 3.C++的灵魂,c++的类. 4.如何定义一个类. 5.什么是对象. 6.如何定义一个对象. 直接定义: 在堆里面定义. 删除对象 ...
- GPT 中的函数调用(function call)是什么?
在 OpenAI ChatGPT API 和 Google Gemini API 中我们可以看到函数调用的功能.这个功能是做什么用的?下面大概讲解. 以 Google Gemini API 函数调用 ...
- Windos操作系统下的Zookeeper安装图文教程
凯哥已经准备好最新版本3.9.1且已经配置好了.既获取到配置好的. 获取到凯哥准备的安装后,只需要修改一下配置.将解压包解压后,找到conf文件,里面有个zoo.cfg配置文件.如下图: 下载后con ...
- 淘宝开放平台api申请,淘宝开放平台api租用,淘宝开放平台api无法申请,淘宝开放平台api暂停接入
目前淘宝开放平台应用申请是关闭了的,已经无法申请到了,如果你是天猫店铺,可以申请供自己店铺使用的权限,如果你不是天猫店铺或者你是软件开发商,目前是申请不到权限的 如果你必须要用到这个权限包的话,可以联 ...
- 【YashanDB知识库】v$instance视图中实例角色含义不明确
[标题]v$instance视图中实例角色含义不明确 [问题分类]文档问题 [关键词]YashanDB, v$instance, 实例角色 [问题描述]v$instance视图中实例角色(如MASTE ...
- VS Code – Keyboard Shortcuts
前言 记入一些自己常用到的 Keyboard Shortcuts 和 Extensions. Keyboard Shortcuts undo redo 鼠标坐标:shift + left/right ...
- CSS – Reset CSS / Base CSS
前言 许多 element tag 都有自带的 style. 比如 h1 默认 font-size 是 2 em anchor 默认颜色是 blue 大部分默认 style 并不会是开发人员期望的效果 ...