作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏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. java增量发布工具

    有些公司由于没有使用maven作为构建工具,全量发布时没问题,而修改bug增量发布往往是将改动的代码手动编译后,从classes目录下拷贝到jar中然后再放到tomcat目录下发布,这种方法准确度不高 ...

  2. 100ASK_IMX6ULL arm板子如何移植刷卡器

    最近为了在arm板子上移植刷卡器,比较简单,但也遇到了坑,现在和大家分享下. 购买刷卡器 某宝很多,应该选哪一种呢? 一口君一共买了4种刷卡器,有2种可以用,还有2种不能用. 下图为最方便的一款,一口 ...

  3. 如何用C语言操作sqlite3,一文搞懂

    sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了. 数据库 本篇假设数据库为my.db,有数据表student. no name score ...

  4. 在DLL中封装模板类的问题

    在Dll中封装类是用定义一个宏来区分导出标识的 #ifdef DLLCLASS_EXPORTS #define DLL_CLASS _declspec(dllexport) //Dll #else # ...

  5. 怎样在局域网中给网站作ssl认证,使其能以https协议访问(转)

    如果要在局域网达到效果需要满足以下几点要求: 1. 证书由可信任的CA机构颁发 2. 证书在有效期 3. 访问地址和证书的认证地址一致 说明: 1. 需要在局域网内构建CA机构 2. 证书的有效期建议 ...

  6. Java并发编程之验证volatile指令重排-理论篇

    Java并发编程之验证volatile指令重排-理论篇 Java并发包下的类中大量使用了volatile关键字.通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性:不保证原子性 ...

  7. Android 获取当前获取焦点的组件

    在Activity中,使用this.getCurrentFocus(),获取当前焦点所在的View, 再判断是否是EditText(可调整成其他组件),看个人需要再做特定的逻辑处理 String co ...

  8. 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)

    目录 目录:d2l包安装失败的解决过程 前言 一.李沐提供的安装方式 1. 创建一个新的环境 2. 激活 d2l 环境 3. 安装深度学习框架和d2l软件包 3.1 安装PyTorch的CPU或GPU ...

  9. 机器学习--决策树算法(CART)

    CART分类树算法 特征选择 ​ 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择.在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题. ...

  10. wxpython开发gui界面基础

    wxpython 开发gui 基础知识 一 .前言 记录使用wxpython开发gui工具吧.gui界面主要就是先布局,每个模块都是一个对象. 二.基础知识 import wx class MyFra ...